C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较
使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和不夸跨线程执行UI更新报错的最佳实践,附加几种其他方式比较
由于是Winform代码和其他原因,本文章只做代码截图演示,不做界面UI展示,当然所有代码都会在截图展示。
1.1 演示工程截图 1.2按钮和进度条控件演示
2.1 定义相关事件
解析:最前面的是普通的事件定义,后面2行是异步定义。
2.2 按钮名称[Task]执行普通异步Task
解析调用过程:当用户点击按钮时会加载所有用户注册的事件进行多线程分发,单独每一个委托进行执行,最后单独使用线程进行等待,这样不阻塞UI线程。
但是用户注册的事件方法如果有更新UI会报错,需要额外的Invoke进行处理。
2.3 按钮名称[BeginInvoke]执行普通异步
解析调用过程:这个调用过程和Task一样,但是简单,这个也可以写成多事件注册,多多领会异步编程模型的好处(原理:异步执行,内部等待信号通知结束)。
2.4 (推荐)按钮名称[Task await]执行方便的异步耗时操作和简单的UI
解析调用过程:推荐的方式附加调用流程
这个全是优点啊:代码精简,异步执行方法可以像同步的方式来调用,用户注册的事件方法可以随意更新UI,无需invoke,稍微改造一下就能多事件注册。
大家有时间的可以自己根据截图去敲打代码试试,总结如下:
1.按钮名称[Task] : 可以实现多个事件注册,但是代码比较多,需要额外的线程等待来结束进度条,而且用户注册的事件的方法更新UI时会报错,提示跨线程操作UI,需要invoke方法调用到UI线程执行。
2.按钮名称[BeginInvoke] : 简单方便的异步编程模型,不需要额外的线程等待结束来结束进度条,缺点和按钮名称[Task]一样,用户注册的事件的方法更新UI时会报错,提示跨线程操作UI,需要invoke方法调用到UI线程执行.
3.按钮名称[Task await] : 稍微有一点点绕,但是简单呀,不需要额外的线程等待UI更新进度条,像同步方法放在await后面即可,而且用户注册的事件方法 更新UI时不需要invoke方法回到UI线程执行。
最新文章
- css_03之文本、浮动
- 初探ReactJS.NET 开发
- .Net下的 ORM框架介紹
- Docker distrubution in django
- linux笔记:shell编程-正则表达式
- DDOS的攻击原理和防护指南(转)
- Import SHA2 SSL cert to Windows IIS7
- LBS由ip查经纬度
- 【8】JAVA---地址App小软件(AddrDaoFile .class)(数据层)
- ZOJ3551 Bloodsucker(概率dp)
- maven package:Max maven Unsupported major.minor version 51.0
- 处理浏览器兼容 各个浏览器的标识 hack
- Java经典编程题50道之十五
- 【生活随笔】Introspection of my life in 2014
- .NET MVC中的数据验证
- MySQL 基础 DDL和DML
- gdb 常用调试命令
- 贪吃蛇 Java实现(一)
- 系统监控nagios–安装
- 删除sql注入