C# Async/await是一种很好的语法糖

C# Async/await是一种很好的语法糖,c#,.net,async-await,c#-5.0,C#,.net,Async Await,C# 5.0,我们可以说C#async/await模式是一种 (智能)糖语法 因为就我所见,在最后,它“只是”为程序员隐藏了(内部)工作线程的所有实现。是的,没有对wait的CLR支持。它在编译时就消失了。任何你可以用写的东西都可以等待你可以不用它来写 等待任务这是一种奇特的调用ContinueWith:)的方式 反编译使用await的程序集,以查看它如何在封面下工作。异步/await确实是语法上的甜点,但是,它不仅仅隐藏线程。仅仅因为您在方法中使用了async和await,并不意味着您正在创建线程 从MSD

我们可以说C#async/await模式是一种 (智能)糖语法


因为就我所见,在最后,它“只是”为程序员隐藏了(内部)工作线程的所有实现。

是的,没有对
wait
的CLR支持。它在编译时就消失了。任何你可以用
写的东西都可以等待
你可以不用它来写

等待任务这是一种奇特的调用
ContinueWith
:)的方式


反编译使用await的程序集,以查看它如何在封面下工作。

异步/await
确实是语法上的甜点,但是,它不仅仅隐藏线程。仅仅因为您在方法中使用了
async
await
,并不意味着您正在创建线程

从MSDN文章中:

async和await关键字不会导致添加额外的线程 创建。异步方法不需要多线程,因为异步 方法不在自己的线程上运行。该方法在当前服务器上运行 同步上下文,并且仅当 方法处于活动状态。您可以使用Task.Run将CPU绑定的工作移动到 后台线程,但后台线程对进程没有帮助 那只是等待结果出来


这里没有工作线程。下面是获取
异步等待
真正的功能。顺便说一句,即使是程序集也是围绕机器代码进行的语法调整。但是它编译的内容确实得到了框架的支持。也许
async
await
关键字是语法糖,但整个async-await范例不是。您可以自己编写所有此类库。您可以编写自己的TaskWaiter,这是唯一需要替换的东西。事实上,异步目标包就是这样做的。await在await之前的4.0上工作。你可以为许多特性(例如LINQ)这样做,我仍然不会称它们为“只是”语法糖。如果对CLR的更改不是语法糖,那么只剩下几个.LINQ查询表达式当然是纯粹的语法糖。库组件不可用。任何人都可以写。也就是说,公平地说,所有的C#都是语法上的糖。。。我想这个概念的定义很弱,我同意。这就是为什么我说从异步方法到状态机的转换可能只是语法上的糖分,但TAP特性作为一个整体不是。