C#.NET WinForm 多个子Task嵌套 Task.WaitAll 阻塞UI线程
C#.NET WinForm 多个子Task(子线程)嵌套 Task.WaitAll 阻塞UI线程 (界面)
情况:
DoIt()方法内,开了2个Task 执行任务,子任务中会更新UI。
DoIt() 是同步(UI线程)。
DoIt()部分代码:
var myTask = Task.Run(() =>
{
DoIt2(lstBatch1, 1);
});
Task.WaitAll(myTask); curMsg = NS() + " batch 2 ";
InserLbxMsg(curMsg); myTask = Task.Run(() =>
{
DoIt2(lstBatch2, 2);
});
Task.WaitAll(myTask);
DoIt2 方法内会更新UI ,InvokeInserLbxMsg(curMsg); 。
/// <summary>
/// BeginInvoke
/// </summary>
/// <param name="curMsg"></param>
void InvokeInserLbxMsg(string curMsg)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new MethodInvoker(() =>
{
lbxMsg.Items.Insert(0, curMsg);
}));
}
else
{
lbxMsg.Items.Insert(0, curMsg);
}
}
结果导致 DoIt2 更新UI失败,并阻塞了UI线程 。
解决方法:
DoIt 方法内2个Task.WaitAll,换成 ContinueWith:
var myTask = Task.Run(() =>
{
DoIt2(lstBatch1, 1);
});
myTask.ContinueWith(t =>
{
DoIt2(lstBatch2, 2);
InvokeInserLbxMsg("完成");
});
重点: UI线程的方法(同步),不要用Task.WaitAll。
--
C#.NET WinForm 多个子Task嵌套 Task.WaitAll 阻塞UI线程的更多相关文章
- C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较
使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新 使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和 ...
- 多线程 更新 winform 控件的值,以避免UI线程的卡顿
委托 private delegate void UpdateDGV_AddRes_CallBack(Int32 i,bool Res); 函数实现 private void UpdateDGV_De ...
- .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
一个简单的 Task 不会消耗多少时间,但如果你不合适地将 Task 转为同步等待,那么也可能很快耗尽线程池的所有资源,出现类似死锁的情况. 本文将以一个最简单的例子说明如何出现以及避免这样的问题. ...
- c# Task编程一个task抛出异常后怎么取消其他线程
从MSDN的Forum上看到别人提供的解决方案,感觉还是比较靠谱,所以就保存下来. CancellationTokenSource cts = new CancellationTokenSource( ...
- 第八节:Task的各类Task<TResult>返回值以及通用线程的异常处理方案。
一. Task的各种返回值-Task<TResult> PS: 在前面章节,我们介绍了Task类开启线程.线程等待.线程延续的方式,但我们并没有关注这些方式的返回值,其实他们都是有返回值的 ...
- C# Task,new Task().Start(),Task.Run();TTask.Factory.StartNew
1. Task task = new Task(() => { MultiplyMethod(a, b); }); task.Start(); 2. Task task = Task.Run(( ...
- await 关键字 后面跟Task 和Task <T>
1.Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: ◆ ThreadPool不支持线程的取消.完成.失败通知等交互性 ...
- Winform非UI线程更新UI界面的各种方法小结
我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的.但是我们在进行异步操作时,经常需要将异步执行的进度报告给用户,让用户知道任务的进度,不至于让用户误认为程序“死掉了”,特别是对 ...
- WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )
WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...
- Task 使用 Task以及Task.Factory都是在.Net 4引用的。Task跟Thread很类似,通过下面例子可以看到。
static public void ThreadMain() { Thread t1 = new Thread(TaskWorker); t1.Start(3); } static public v ...
随机推荐
- 淘宝推荐、视频搜索背后的检索技术竟是它!深度揭秘达摩院向量检索引擎Proxima
简介: 淘宝搜索推荐.视频搜索的背后使用了什么样的检索技术?非结构化数据检索,向量检索,以及多模态检索,它们到底解决了什么问题?今天由阿里巴巴达摩院的科学家从业务问题出发,抽丝剥茧,深度揭秘达摩院内部 ...
- 深度解析开源推荐算法框架EasyRec的核心概念和优势
简介:如何通过机器学习PAI实现快速构建推荐模型 作者:程孟力 - 机器学习PAI团队 随着移动app的普及,个性化推荐和广告成为很多app不可或缺的一部分.他们在改善用户体验和提升app的收益方面 ...
- WPF 探索任务管理器的进程分组逻辑
在看到 Win10 或 Win11 的 Task Manager 任务管理器时,不知大家是否有一个疑问,在 进程 标签里的应用进程是如何分组的.为什么有些组能包含很多个不同的进程,有些只能包含一个.本 ...
- vue框架keepAlive缓存的坑
页面跳转顺序index=>detail2=>detail3(三个页面不是单独请求数据,后两个页面是第一个页面数据的传递) detail2页面与methods同级: beforeRouteL ...
- selenium项目中遇到的问题总结
问题:在pycharm中运行用例能成功,在命令行运行提示找不到com包解决办法:添加一个PYTHONPATH的环境变量,值为工程目录的路径 当要查找的文本前后有换行时,用如下方法解决//td[cont ...
- 从零开始:Django项目的创建与配置指南
title: 从零开始:Django项目的创建与配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 后端开发 tag ...
- Typora+免费图床,构建随处可用的Markdown文档
Typora+PicGo+Gitee自动上传图片 视频教程: https://www.bilibili.com/video/BV1hT4y1f7Mf?from=search&seid=1546 ...
- ubuntu系统下安装php7.4
目录 一.下载/更新php源 二.安装php7.4 三.修改配置 3.1 修改www.conf 文件 四.配置域名 五.nginx的配置文件 5.1 sock方式和nginx配合工作 5.2监听900 ...
- CentOS加载yum源时报错 [Errno 14] HTTP Error 404 - Not Found Trying other mirror.
报错内容: [root@192 yum.repos.d]# yum repolist Loaded plugins: fastestmirror, product-id, search-disable ...
- leaflet 使用kriging.js实现前端自定义插值
1.GitHub地址:https://github.com/oeo4b/kriging.js 2.核心代码 var variogram = kriging.train(t, x, y, model, ...