开发者社区> 杰克.陈> 正文

C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较

简介: 原文:C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较 使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新   使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和不夸跨线程执行UI更新报错的最佳实践,附加几种其他方式比较 由于是Winform代码和其他原因,本文章只做代码截图演示,不做界面UI展示,当然所有代码都会在截图展示。
+关注继续查看
原文:C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较

使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新

  使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和不夸跨线程执行UI更新报错的最佳实践,附加几种其他方式比较

由于是Winform代码和其他原因,本文章只做代码截图演示,不做界面UI展示,当然所有代码都会在截图展示。

 

1:封装异步按钮(为了比较放了3个按钮)和进度条的控件,包含基本文件演示截图

1.1 演示工程截图 1.2按钮和进度条控件演示 

 

2:定义异步委托和事件和几种演示封装

2.1 定义相关事件
解析:最前面的是普通的事件定义,后面2行是异步定义。

 

2.2 按钮名称[Task]执行普通异步Task

解析调用过程:当用户点击按钮时会加载所有用户注册的事件进行多线程分发,单独每一个委托进行执行,最后单独使用线程进行等待,这样不阻塞UI线程。

但是用户注册的事件方法如果有更新UI会报错,需要额外的Invoke进行处理。

 

 

2.3 按钮名称[BeginInvoke]执行普通异步

解析调用过程:这个调用过程和Task一样,但是简单,这个也可以写成多事件注册,多多领会异步编程模型的好处(原理:异步执行,内部等待信号通知结束)。

 

 

2.4 (推荐)按钮名称[Task await]执行方便的异步耗时操作和简单的UI

解析调用过程:推荐的方式附加调用流程

 这个全是优点啊:代码精简,异步执行方法可以像同步的方式来调用,用户注册的事件方法可以随意更新UI,无需invoke,稍微改造一下就能多事件注册。

 

3:其他用户调用封装好的异步按钮执行耗时操作

 

 

总结

 

大家有时间的可以自己根据截图去敲打代码试试,总结如下:

1.按钮名称[Task]   : 可以实现多个事件注册,但是代码比较多,需要额外的线程等待来结束进度条,而且用户注册的事件的方法更新UI时会报错,提示跨线程操作UI,需要invoke方法调用到UI线程执行。

2.按钮名称[BeginInvoke] :  简单方便的异步编程模型,不需要额外的线程等待结束来结束进度条,缺点和按钮名称[Task]一样,用户注册的事件的方法更新UI时会报错,提示跨线程操作UI,需要invoke方法调用到UI线程执行.

3.按钮名称[Task await] : 稍微有一点点绕,但是简单呀,不需要额外的线程等待UI更新进度条,像同步方法放在await后面即可,而且用户注册的事件方法 更新UI时不需要invoke方法回到UI线程执行。

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
项目管理控件Aspose.Tasks for .NET v19.7发布上线!附下载
  Aspose.Tasks for .NET是一个可靠的项目管理API,用于处理Microsoft Project文件。支持读取,写入和操作Microsoft Project文档,而不依赖于任何Microsoft Project。此外,API公开项目数据以提供完整的项目规划,定义和跟踪功能。   Aspose.Tasks for .NET展示了项目数据,如任务,资源,资源分配和扩展属性数据,以便开发人员可以操作它们。用户可以通过创建和读取任务和资源来完全规划项目,并为任务分配或删除资源。用户可以操纵任务约束,优先级,关键和工作驱动的任务,停止或恢复任务和拆分任务,管理扩展属性,链接任务并将
69 0
MobileForm控件的使用方式--用.NET(C#)开发APP的学习日志
今天继续Smobiler开发APP的学习日志,这次是做一个title、toolbar、侧边栏三种效果   样式一 一、          Toolbar 1.       目标样式 我们要实现上图中的效果,需要如下的操作: 2.
3683 0
基于.NET的APP开发和Windows开发,异步回调差别
Smobiler中的异步回调机制 在Smobiler的开发中,控件或组件及客户端功能都是通过事件或委托来进行处理的。 Smobiler是基于异步非阻塞的方式来运行的 下面我们分别对Windows的和Smobiler的MessageBox的处理方法来举例说明。
820 0
从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之八 || API项目整体搭建 6.3 异步泛型仓储+依赖注入初探
代码已上传Github+Gitee,文末有地址   番外:在上文中,也是遇到了大家见仁见智的评论和反对,嗯~说实话,积极性稍微受到了一丢丢的打击,不过还好,还是有很多很多很多人的赞同的,所以会一直坚持下去,欢迎提出各种建议,问题,意见等,我这个系列呢,只是一个抛砖引玉的文章,大家可以自定义的去扩展学习,比如你看了.net core api,可以自学.net core mvc呀;看了sqlsugar,可以自学EF,Deppar呀;看了vue,可以自学React、Angular呀,我也是个小白,大家进步是本系列文章的唯一目标。
1562 0
.NET Core 控制台应用程序使用异步(Async)Main方法
C# 7.1 及以上的版本允许我们使用异步的Main方法
7398 0
.Net中偶尔需要使用异步的处理
我们知道程序中使用异步、多线程会提高程序的响应速度,但也不能无限使用多线程,这在高峰会造成系统cpu上升,系统卡顿,这就需要我们自己来控制开启的线程数,不多说看代码。
706 0
+关注
杰克.陈
一个安静的程序猿~
文章
问答
视频
文章排行榜
最热
最新
相关课程
更多
相关电子书
更多
fibjs 模块重构从回调到协程--陈垒
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载