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

 

转载于:https://www.cnblogs.com/NatureSex/p/9468079.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用.NET的List异步循环时,我们可以通过async和await关键字来实现在执行完成后再执行后面的代码。异步循环通常用于处理耗时较长的操作,以避免阻塞线程,提高程序的性能和响应速度。 首先,我们需要在方法的声明使用async关键字来标识该方法异步方法。然后,在使用foreach循环遍历List的时候,我们可以使用await关键字来暂停当前的执行,等待异步操作完成。 例如,假设我们有一个List<int> numbers,我们想对其的每个元素进行异步处理,然后再执行后面的代码。代码示例如下: ```csharp async Task SomeMethod() { List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; foreach(var number in numbers) { await SomeAsyncOperation(number); // 异步处理 // 执行完成后的代码 Console.WriteLine($"处理完成:{number}"); } // 所有异步操作完成后的代码 Console.WriteLine("所有异步操作已完成"); } async Task SomeAsyncOperation(int number) { // 模拟异步操作 await Task.Delay(1000); Console.WriteLine($"正在处理:{number}"); } ``` 在上述代码,我们定义了一个SomeMethod方法,其使用async关键字来表示该方法异步方法。在循环遍历List的过程,我们使用了await关键字来暂停执行,并等待SomeAsyncOperation方法异步操作完成。 在SomeAsyncOperation方法,我们使用Task.Delay来模拟一个耗时操作,并输出当前处理的数字。在实际的应用,你可以替换为实际的异步操作。 当所有的异步操作都完成后,程序会继续执行之后的代码,输出"所有异步操作已完成"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值