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

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

  1. Button控件双击事件不执行

    Button控件双击事件不执行 最近组态组新加入了一位同事,该同事原先是做ASP.NET的,没有做过WindowForm的开发.所以就先安排一个小示例来测验一下.这个示例有些年头了,当年我进入组态开发 ...

  2. 对于Linq关键字和await,async异步关键字的扩展使用

    最近在看neuecc大佬写的一些库:https://neuecc.medium.com/,其中对await,async以及linq一些关键字实现了自定义化使用, 使其不需要引用对应命名空间,不需要多线 ...

  3. aspx页面Page_Load和aspx页面上控件Page_Load事件执行顺序

    今天公司的同事问了我一个问题,就是页面的Load方法和控件上的Load方法执行顺序的问题,看完了这个图片的递归调用之后大家就笑了,吼吼.

  4. UpdatePanel中用后台CS代码调用JS代码,先执行控件事件,后触发JS

    引用地址: http://www.cnblogs.com/silenkee/articles/1609831.html   页面中加入了UpdatePanel后,Response.Write(&quo ...

  5. Winform与WPF异步修改控件属性

    Winform方式:     if (this.InvokeRequired)             {                 this.Invoke(                   ...

  6. 从Thread,ThreadPool,Task, 到async await 的基本使用方法解读

    记得很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题 ...

  7. Thread,ThreadPool,Task, 到async await 的基本使用方法和理解

    很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题吧. ...

  8. 当一个窗体上有PageControl 控件时,是先执行 FormShow呢,还是先执行PageControl 的 TabSheet2Show呢

    答案是 先执行 TabSheet2Show  ,总算知道了,顺便推理 Onshow事件的执行顺序是 从内到外,先执行容器内的控件的事件,再执行 窗体的事件

  9. 【MFC】Button控件和Picture Control的鼠标事件执行顺序

    1.Button控件鼠标事件执行顺序 (1) WM_LBUTTONDOWN (2) WM_LBUTTONUP (3) OnBnClickedButton1(); 2.Picture Control的鼠 ...

随机推荐

  1. jQuery插件实践之轮播练习(一)

    所有文章搬运自我的个人主页:sheilasun.me 因为从来没写过jQuery插件,所以本文要通过一个轮播的例子,练习jQuery插件的写法. 新建插件文件 在讨论细节之前,先新建插件文件(当然也可 ...

  2. kuangbin 区间dp

    A - Cake 题目大意:给你一个n个顶点(n<=100)的多边形和每两个点连边的消耗,让你求把这个多边形全部切成三角形所需要的最小消耗,如果这个多边形为凹多边形则输出无解. 思路:先求一个凸 ...

  3. Mistwald POJ

    一开始看不出来是快速幂矩阵的题目 先要把整个地图离散化为1,2,3,4,.... 连成一个有向图 邻接矩阵的平方意为:假如a->b  且b->c     那么一次平方后   a->c ...

  4. linux shell cat 命令

    cat:查看文件的内容.连接文件.创建一个或多个文件和重定向输出到终端或文件  用法:cat [选项] [文件] 1. $ cat hello.txt 显示hello.txt文本文件中的内容 2. $ ...

  5. [OpenCV-Python] OpenCV 中的图像处理 部分 IV (二)

    部分 IVOpenCV 中的图像处理 OpenCV-Python 中文教程(搬运)目录 16 图像平滑 目标 • 学习使用不同的低通滤波器对图像进行模糊 • 使用自定义的滤波器对图像进行卷积(2D 卷 ...

  6. pandas学习(创建数据,基本操作)

    pandas学习(一) Pandas基本数据结构 Series类型数据 Dataframe类型 基本操作 Pandas基本数据结构 两种常用数据结构: Series 一维数组,与Numpy中的一维ar ...

  7. 三篇文章带你极速入门php(三)之php原生实现登陆注册

    看下成果 ps:纯天然h5,绝不添加任何添加剂(css)以及化学成分(js)(<( ̄ ﹌  ̄)我就是喜欢纯天然,不接受任何反驳) 关于本文 用原生的php和html做了一个登陆注册,大概是可以窥 ...

  8. python有序字典OrderedDict()

    转python创建有序字典OrderedDict # -*- coding:utf-8 -*- """ python有序字典 需导入模块collections " ...

  9. Codeforces.297C.Splitting the Uniqueness(构造)

    题目链接 \(Description\) 给定一个长为n的序列A,求两个长为n的序列B,C,对任意的i满足B[i]+C[i]=A[i],且B,C序列分别至少有\(\lfloor\frac{2*n}{3 ...

  10. 洛谷.2590.[ZJOI2008]树的统计(树分块)

    题目链接 Update:这种分块写法...可以被卡掉啊... 好像没有靠谱的树分块写法... /* 对树上节点进行分块,每个点记录dep,fa,val,Max,Sum,Max,Sum表示当前点在该块内 ...