QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

泡泡马甲APP 更多内容请下载泡泡马甲手机客户端APP 立即下载 ×
查看: 1317|回复: 0

[C#] 关于C#异步编程的建议

[复制链接]

等级头衔

积分成就    金币 : 2806
   泡泡 : 1516
   精华 : 6
   在线时间 : 1244 小时
   最后登录 : 2024-5-5

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2023-3-20 19:08:20 | 显示全部楼层 |阅读模式
      基于任务的异步编程模型 (TAP) 提供了异步代码的抽象化。你只需像往常一样将代码编写为一连串语句即可。就如每条语句在下一句开始之前完成一样,你可以流畅地阅读代码。编译器将执行许多转换,因为其中一些语句可能会开始运行并返回表示正在进行的工作的 Task。
. h  [: R# {. _      这就是此语法的目标:支持读起来像一连串语句的代码,但会根据外部资源分配和任务完成时间以更复杂的顺序执行。这与人们为包含异步任务的流程给予指令的方式类似。在本文中,你将通过做早餐的指令示例来查看如何使用 async 和 await 关键字更轻松地推断包含一系列异步指令的代码。" n- E- K  f, ^, J
      其中在使用异步方法中最好不要使用void当做返回值,无返回值也应使用Task作为返回值,因为使用void作为返回值具有以下缺点:* {8 A& \% L, b) P& r9 L
  • 无法得知异步函数的状态机在什么时候执行完毕
  • 如果异步函数中出现异常,则会导致进程崩溃; I0 }8 ^2 M9 ~4 l0 W8 g- H
异步函数不应该返回void  y, l  Z# P( Q8 i- o' u
  1. static  void Main(string[] args)
  2. {
  3.      try
  4.      {
  5.           //      如果Run方法无异常正常执行,那么程序无法得知其状态机什么时候执行完毕
  6.           Run();
  7.      }
  8.      catch (Exception ex)
  9.      {
  10.           Console.WriteLine(ex.Message);
  11.      }
  12.      Console.Read();
  13. }
  14. static async void Run()
  15. {
  16.      //      由于方法返回的为void,所以在调用此方法时无法捕捉异常,使得进程崩溃
  17.      throw new Exception("异常了");
  18.      await Task.Run(() => { });
  19. }
应该将异步函数返回Task1 [3 a' Y( s6 T: w  `& d# \  G
  1. static  async Task Main(string[] args)
  2. {
  3.      try
  4.      {
  5.           //     因为在此进行await,所以主程序知道什么时候状态机执行完成
  6.           await RunAsync();
  7.           Console.Read();
  8.      }
  9.      catch (Exception ex)
  10.      {
  11.           Console.WriteLine(ex.Message);
  12.      }
  13. }
  14. static async Task RunAsync()
  15. {
  16.      //      因为此异步方法返回的为Task,所以此异常可以被捕捉
  17.      throw new Exception("异常了");
  18.      await Task.Run(() => { });
  19. }
注:事件是一个例外,异步事件也是返回void
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号 )

GMT+8, 2024-5-8 02:08

Powered by paopaomj X3.4 © 2016-2024 sitemap

快速回复 返回顶部 返回列表