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

  • 相关阅读:
    本地计算机上的SQL Server(MSSQLSERVER)服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止
    三色需求与工作层次
    dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Gold;第一次无效
    c# 在DataTable的第一列(指定列)的前面添加一列
    去掉DataGridView最后一行的空白行,删除空白行
    阿里云OSS Multipart Upload上传实例
    sql 自动增加排序 并且初始值是000001
    HTML禁用Flash文件右键
    HTML,JS禁止鼠标右键、禁止全选、复制、粘贴的方法
    C#PDF转Word
  • 原文地址:https://www.cnblogs.com/NatureSex/p/9468079.html
Copyright © 2020-2023  润新知