task-初次使用Task<TResult>关于阻塞主线程求指教

问题描述

初次使用Task<TResult>关于阻塞主线程求指教

做了一个winform程序,点击一个按钮需要调用一个复杂耗时的方法,总是造成主界面卡死,据说Task可以解决此类情况,就上网查资料模仿,后来发现还是卡死,代码段如下:
City ct = (City)cbxCity.SelectedItem;
bool checkCom = cBoxDisCom.Checked;
Task t = null;
t = new Task(() => ImportService.FilterForRaw2(dt, ct, checkCom));
t.Start();
t.Wait();
dgvExportData.DataSource = t.Result.Tables[1];
dgv1.DataSource = t.Result.Tables[0];
请问有没有办法可以既获取Task产生的结果t.Result,又不会造成主线程阻塞

解决方案

ImportService.FilterForRaw2中不能有同步界面UI并且耗时的代码
不能有t.Wait,否则还是会阻塞界面。

解决方案二:

那就不要wait,自己开一个线程,线程中做完事情,委托通知UI

解决方案三:

BackgroundWorker backgroundWorker1 = new BackgroundWorker();

backgroundWorker1.WorkerReportsProgress = true;

private void btnStart_Click(object sender, EventArgs e)

{

        backgroundWorker1.RunWokerAsync();

}

private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)

{

  for (int i = 1; i < 11; i++)

 {

          Thread.Sleep(2000);

         backgroundWorker1.ReportProgress(i*10);

 }

}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

  //progressBar1是ProgressBar控件

  progressBar1.Value = e.ProgressPercentage;

}

时间: 2024-12-26 10:48:09

task-初次使用Task&amp;lt;TResult&amp;gt;关于阻塞主线程求指教的相关文章

初次搭建struts2开发环境却一直出错,求指教

问题描述 初次搭建struts2开发环境却一直出错,求指教 在初次搭建struts时,总是报错,出现如下代码严重: Dispatcher initialization failedjava.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java

异步编程

概念 异步编程核心为异步操作,该操作一旦启动将在一段时间内完成.所谓异步,关键是实现了两点:(1)正在执行的此操作,不会阻塞原来的线程(2)一旦启动的此操作,可以继续执行其他任务.当该操作完成时,将调用回调函数来通知该操作已经结束. [注]:本人一直以为同步和异步都属于多线程的范畴,到今天才明白完全错误,异步和多线程是属于不同范畴,多线程和异步是并发的两种形式,并行处理和线程同步是多线程的两种形式,这是我当前的理解,不知是否有误,文中若有错误,请园友拍砖并指正,初次学习难免有误,望海涵! 那么问

我为什么喜欢用C#来做并发编程

题记:就语言和运行时层面,C#做并发编程一点都不弱,缺的是生态和社区. 硅谷才女朱赟(我的家门)昨天发了一篇文章<为什么用 Java -- 关于并发编程>,让大家学习了Java中如何进行并发编程的一些基本知识.作为一个将近15年的.NET程序员,我觉得有必要给大家补充介绍一下C#进行并发编程的知识(当然不会太深入讲解).这篇文章无意进行技术比较,毕竟技术只是工具(大同小异,各有千秋),主要还是看用工具的人. 并发(英文Concurrency),其实是一个很泛的概念,字面意思就是"同时

Spring的两种任务调度Scheduled和Async

Spring提供了两种后台任务的方法,分别是: 调度任务,@Schedule 异步任务,@Async 当然,使用这两个是有条件的,需要在spring应用的上下文中声明<task:annotation-driven/>当然,如果我们是基于java配置的,需要在配置哪里加多EnableScheduling和@EnableAsync 就像下面这样 1 2 3 4 5 6 @EnableScheduling @EnableAsync public class WebAppConfig {   ....

【转】聊聊java高并发系统之异步非阻塞

在做电商系统时,流量入口如首页.活动页.商品详情页等系统承载了网站的大部分流量,而这些系统的主要职责包括聚合数据拼装模板.热点统计.缓存.下游功能降级开关.托底数据等等.其中聚合数据需要调用其它多个系统服务获取数据.拼装数据/模板然后返回给前端,聚合数据来源主要有依赖系统/服务.缓存.数据库等:而系统之间的调用可以通过如http接口调用(如HttpClient).SOA服务调用(如dubbo.thrift)等等.   在Java中,如使用Tomcat,一个请求会分配一个线程进行请求处理,该线程负

Golang中的sync.WaitGroup用法实例_Golang

WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成. 官方对它的说明如下: A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and

Android实现listview动态加载数据分页的两种方法_Android

在android开发中,经常需要使用数据分页,比如要实现一个新闻列表的显示,或者博文列表的显示,不可能第一次加载就展示出全部,这就需要使用分页的方法来加载数据,在android中Handler经常用来在耗时的工作中,它接收子线程发送的数据,并使用数据配合更新UI,AsyncTask是在一个线程中执行耗时操作然后把结果传给UI线程,不需要你亲自去管理线程和句柄. 一.使用Handler+线程方法1.基础知识Handler在android系统中,主要负责发送和接收消息,它的用途主要有以下两种: (1

PHP命令行执行整合pathinfo模拟定时任务实例_php实例

命令行模式下,根据传参,调用不同控制器.控制器中根据配置定时执行指定方法 Application.php <?php class Application{ public static function main(){ header("content-type:text/html;charset=utf-8"); self::register(); self::commandLine(); self::pathInfo(); } //自动加载 public static funct

PHP命令行执行整合pathinfo模拟定时任务实例

命令行模式下,根据传参,调用不同控制器.控制器中根据配置定时执行指定方法 Application.php <?php class Application{ public static function main(){ header("content-type:text/html;charset=utf-8"); self::register(); self::commandLine(); self::pathInfo(); } //自动加载 public static funct