基于任务的异步编程模型 (TAP) 提供了异步代码的抽象化。你只需像往常一样将代码编写为一连串语句即可。就如每条语句在下一句开始之前完成一样,你可以流畅地阅读代码。编译器将执行许多转换,因为其中一些语句可能会开始运行并返回表示正在进行的工作的 Task。

这就是此语法的目标:支持读起来像一连串语句的代码,但会根据外部资源分配和任务完成时间以更复杂的顺序执行。这与人们为包含异步任务的流程给予指令的方式类似。在本文中,你将通过做早餐的指令示例来查看如何使用 async 和 await 关键字更轻松地推断包含一系列异步指令的代码。

其中在使用异步方法中最好不要使用void当做返回值,无返回值也应使用Task作为返回值,因为使用void作为返回值具有以下缺点

无法得知异步函数的状态机在什么时候执行完毕

如果异步函数中出现异常,则会导致进程崩溃

❌异步函数不应该返回void

static  void Main(string[] args)
{try{//      如果Run方法无异常正常执行,那么程序无法得知其状态机什么时候执行完毕Run();}catch (Exception ex){Console.WriteLine(ex.Message);}Console.Read();
}
static async void Run()
{//      由于方法返回的为void,所以在调用此方法时无法捕捉异常,使得进程崩溃throw new Exception("异常了");await Task.Run(() => { });}

☑️应该将异步函数返回Task

static  async Task Main(string[] args)
{try{//     因为在此进行await,所以主程序知道什么时候状态机执行完成await RunAsync();Console.Read();}catch (Exception ex){Console.WriteLine(ex.Message);}
}
static async Task RunAsync()
{//      因为此异步方法返回的为Task,所以此异常可以被捕捉throw new Exception("异常了");await Task.Run(() => { });}

注:事件是一个例外,异步事件也是返回void

关于C#异步编程的建议相关推荐

  1. 超赞!阿里资深P9架构师总结出第一本《Java异步编程实战》

    什么是异步编程: 传统的同步编程是一种请求响应模型,调用一个方法,等待其响应返回 异步编程就是要重新考虑是否需要响应的问题,也就是缩小需要响应的地方.因为越快获得响应,就是越同步化,顺序化,事务化,性 ...

  2. 关于C#异步编程你应该了解的几点建议

    前段时间写了一篇关于C#异步编程入门的文章,你可以点击<C#异步编程入门看这篇就够了>查看.这篇文章我们来讨论下关于C#异步编程几个不成文的建议,希望对你写出高性能的异步编程代码有所帮助. ...

  3. 【C++】多线程与异步编程【四】

    文章目录 [C++]多线程与异步编程[四] 0.三问 1.什么是异步编程? 1.1同步与异步 1.2 **阻塞与非阻塞** 2.如何使用异步编程 2.1 使用全局变量与条件变量传递结果 实例1: 2. ...

  4. nodejs笔记-异步编程

    1.函数式编程 1.1高阶函数 函数参数只接受基本数据类型或者对象引用,返回值也是基本数据类型和对象引用. //常规参数传递和返回 function foo(x) {return x; } 复制代码 ...

  5. mysql 数据库引擎切花_asyncio异步编程【含视频教程】

    不知道你是否发现,身边聊异步的人越来越多了,比如:FastAPI.Tornado.Sanic.Django 3.aiohttp等. 听说异步如何如何牛逼?性能如何吊炸天....但他到底是咋回事呢? 本 ...

  6. 异步编程(asyncawait)

    前言 本来这篇文章上个月就该发布了,但是因为忙 QuarkDoc  一直没有时间整理,所以耽搁到今天,现在回归正轨. C# 5.0 虽然只引入了2个新关键词:async和await.然而它大大简化了异 ...

  7. 异步编程 In .NET(转载)

    概述 在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试.今天我们再来回答一下这个问题,同时我们 ...

  8. 协程、asyncio、异步编程

    文章目录 1 协程 2 异步编程 3.1 事件循环 3.2 async 3.3 await 3.4 Task对象 1 协程 协程不是由操作系统提供,由程序员人为提供(用户态上下文切换技术) 协称(Co ...

  9. python2异步编程_最新Python异步编程详解

    我们都知道对于I/O相关的程序来说,异步编程可以大幅度的提高系统的吞吐量,因为在某个I/O操作的读写过程中,系统可以先去处理其它的操作(通常是其它的I/O操作),那么Python中是如何实现异步编程的 ...

最新文章

  1. 深度学习“三部曲”重磅资源、python、DL理论、工程实战全覆盖(附免费下载)...
  2. 解决注册并发问题并提高QPS
  3. Java程序员3面小米,被俩算法题难倒,微软员工6分钟解决,真丢脸
  4. 小程序promise封装post请求_微信小程序promise封装get/post请求
  5. 中山行书百年纪念版字体可以商用吗_干货|免费可商用字体
  6. 关于matlab的单精度与双精度
  7. python桌面图形_Python桌面图形程序美化的方法论
  8. Gradle build设置自动log开关
  9. 1081. Rational Sum (20) -最大公约数
  10. 如何学习matlab 知乎,知乎日报
  11. Java中12个原子操作类
  12. SQL Server中 sysobjects、syscolumns、systypes
  13. Path(0)贝塞尔曲线
  14. infopath转换html,Microsoft Tools to Save InfoPath Forms as HTML
  15. ORACLE表、表分区、表空间的区别
  16. ubuntu软件安装、卸载
  17. bootstrap datetimepicker 初始化及取值
  18. 如何使用Mac电脑内置的屏幕共享功能进行远程桌面协助?
  19. 纪中游记 - Day 3
  20. 《Redis视频教程》(p2)

热门文章

  1. PHP判断客户端的浏览器类型
  2. Element.shadowRoot
  3. jmete 学习--基础之名词解释
  4. 初始Bootstrap
  5. selenium+python笔记3
  6. android数据持久化存储(2)
  7. Windows按名称排序问题
  8. [正则表达式] 可以解析HTML/XHTML页面的所有元素和结构的Regular Expression![ZT]
  9. java windows 取所有任务_Win下,通过Jstack截取Java进程中的堆栈信息
  10. 如何在Outlook 2013中管理附件