async/await - 这种理解是否正确?

isp*_*iro 6 .net c# multithreading asynchronous async-await

经过两个问题和很多混乱 - 我想知道我是否最终做对了.这是我的理解:

async/await用于一个目的 - 允许在完成异步任务后执行代码.例如

async Task CallerMethod()
{
     await AsyncMethod();
     AnotherMethod();
}
Run Code Online (Sandbox Code Playgroud)

允许AnotherMethod异步后执行AsyncMethod结束,而不是后立即AsyncMethod启动.

async/await NEVER 使任何异步.它不会启动一个单独的线程(当然,除非等待的方法是这样做的),等等.

我的理解(最后)是否正确?

Eri*_*ert 15

虽然斯蒂芬的答案是正确的,但我想确保你有一些额外的要点.

async/await NEVER使任何异步

它是CallerMethod一个异步方法.CallerMethod返回一个Task本身可以等待的东西,并CallerMethod在工作CallerMethod本身完成之前返回该任务,因此它是一个异步方法.

它不会AsyncMethod异步; 它已经是异步的.

它不会启动单独的线程

对.这是混淆的常见原因.线程是并发的一个单元,它只是一种异步.类比通常有帮助.你可以把面包放在烤面包机里,等待烤好,然后做成鸡蛋.你可以将面包放在烤面包机里,在吐司烘烤的同时煮鸡蛋,然后在鸡蛋完成后处理吐司.或者你可以雇两个厨师,一个煮鸡蛋,一个做烤面包.第一种是同步处理.第二个和第三个是异步的,但只有第三个是并发的.请注意,第三种解决方案是最昂贵的; 线程是工人,工人也不便宜.

什么使异步方法异步并不是它是并发的 - 虽然它可能是.使它异步的原因在于它为您提供了一种机制,允许您在等待其工作完成时执行其他操作.await只是一种愉快的方式来写"这是我希望你在任务成功完成后运行的代码".

  • @ispiro:这本身就暗示了一种常见的误解; 斯蒂芬有一篇很棒的文章揭穿了硬件I/O在某种程度上是多线程的想法,我当然也没有比推荐你更好.搜索"Stephen Cleary没有线程",你会发现它. (2认同)
  • @ i3arnon:当然,这是一个好点.如果硬件正在执行并发操作,则可以并发 - 同时 - 在没有其他线程的情况下发生操作. (2认同)

Ste*_*ary 7

async/await NEVER使任何异步.它不会启动一个单独的线程(当然,除非等待的方法是这样做的),等等.

是.

换句话说,async/ await允许从异步角度编写代码.也就是说,代码可以"异步等待"(await)操作完成,然后定义自己的异步操作(从async方法返回的任务,表示该方法的执行).