使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和不夸跨线程执行UI更新报错的最佳实践,附加几种其余方式比较编程
因为是Winform代码和其余缘由,本文章只作代码截图演示,不作界面UI展现,固然全部代码都会在截图展现。多线程
1.1 演示工程截图 1.2按钮和进度条控件演示
异步
2.1 定义相关事件
解析:最前面的是普通的事件定义,后面2行是异步定义。async
2.2 按钮名称[Task]执行普通异步Task异步编程
解析调用过程:当用户点击按钮时会加载全部用户注册的事件进行多线程分发,单独每个委托进行执行,最后单独使用线程进行等待,这样不阻塞UI线程。spa
可是用户注册的事件方法若是有更新UI会报错,须要额外的Invoke进行处理。线程
2.3 按钮名称[BeginInvoke]执行普通异步3d
解析调用过程:这个调用过程和Task同样,可是简单,这个也能够写成多事件注册,多多领会异步编程模型的好处(原理:异步执行,内部等待信号通知结束)。orm
2.4 (推荐)按钮名称[Task await]执行方便的异步耗时操做和简单的UIblog
解析调用过程:推荐的方式附加调用流程
这个全是优势啊:代码精简,异步执行方法能够像同步的方式来调用,用户注册的事件方法能够随意更新UI,无需invoke,稍微改造一下就能多事件注册。
你们有时间的能够本身根据截图去敲打代码试试,总结以下:
1.按钮名称[Task] : 能够实现多个事件注册,可是代码比较多,须要额外的线程等待来结束进度条,并且用户注册的事件的方法更新UI时会报错,提示跨线程操做UI,须要invoke方法调用到UI线程执行。
2.按钮名称[BeginInvoke] : 简单方便的异步编程模型,不须要额外的线程等待结束来结束进度条,缺点和按钮名称[Task]同样,用户注册的事件的方法更新UI时会报错,提示跨线程操做UI,须要invoke方法调用到UI线程执行.
3.按钮名称[Task await] : 稍微有一点点绕,可是简单呀,不须要额外的线程等待UI更新进度条,像同步方法放在await后面便可,并且用户注册的事件方法 更新UI时不须要invoke方法回到UI线程执行。