使用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线程执行。

最新文章

  1. css_03之文本、浮动
  2. 初探ReactJS.NET 开发
  3. .Net下的 ORM框架介紹
  4. Docker distrubution in django
  5. linux笔记:shell编程-正则表达式
  6. DDOS的攻击原理和防护指南(转)
  7. Import SHA2 SSL cert to Windows IIS7
  8. LBS由ip查经纬度
  9. 【8】JAVA---地址App小软件(AddrDaoFile .class)(数据层)
  10. ZOJ3551 Bloodsucker(概率dp)
  11. maven package:Max maven Unsupported major.minor version 51.0
  12. 处理浏览器兼容 各个浏览器的标识 hack
  13. Java经典编程题50道之十五
  14. 【生活随笔】Introspection of my life in 2014
  15. .NET MVC中的数据验证
  16. MySQL 基础 DDL和DML
  17. gdb 常用调试命令
  18. 贪吃蛇 Java实现(一)
  19. 系统监控nagios–安装
  20. 删除sql注入

热门文章

  1. springbank 开发日志 springbank是如何注册handler的
  2. java:大小写字母转换
  3. NodeMCU入门(3):断线自动重连,指示灯显示连接状态
  4. 080 HBase的属性
  5. pandas.cut使用总结
  6. Python Django 学习 (一) 【Django 框架初探】
  7. Linux 运行Python文件,不因终端关闭而终止运行
  8. [VB]常用函数
  9. BZOJ.2095.[POI2010]Bridges(最大流ISAP 二分 欧拉回路)
  10. 洛谷P2242 公路维修问题