经过两个问题和混乱之后 - 我想知道我是否最终做对了。这是我的理解:
async/await
仅提供一个目的 - 允许在已经异步任务完成后执行代码。
e.g。
async Task CallerMethod()
{
await AsyncMethod();
AnotherMethod();
}
允许AnotherMethod
在异步AsyncMethod
完成后执行,而不是在AsyncMethod
启动之后立即执行。
async / await NEVER 使异步。它不会启动一个单独的线程(除非等待的方法无论如何都要这样做),等等。
我的理解(最后)是否正确?
答案 0 :(得分:15)
虽然斯蒂芬的回答是正确的,但我想确保你有一些额外的要点。
async / await NEVER使任何异步
它使CallerMethod
成为异步方法。 CallerMethod
返回一个Task
,它本身可以等待,CallerMethod
在CallerMethod
的工作完成之前返回该任务,因此它是一个异步方法。
它不会使AsyncMethod
异步;它已经是异步的。
它不会启动单独的线程
右。这是混淆的常见原因。线程是并发的一个单元,它只是一种异步。类比通常有帮助。你可以把面包放在烤面包机里,等待它烤好,然后做成鸡蛋。你可以将面包放在烤面包机里,在吐司烘烤的同时煮鸡蛋,然后在鸡蛋完成后处理吐司。或者你可以雇两个厨师,一个煮鸡蛋,一个做烤面包。第一种是同步处理。第二个和第三个是异步的,但只有第三个是并发的。请注意,第三种解决方案是最昂贵的;线程是工人,工人也不便宜。
使异步方法异步的原因并不是它是并发的 - 尽管它可能是。使它异步的原因在于它为您提供了一种机制,允许您在等待其工作完成时执行其他操作。 await
只是一种令人愉快的方式来写“这是我希望你在任务成功完成后运行的代码”。
答案 1 :(得分:7)
async / await NEVER使任何异步。它不会启动一个单独的线程(除非等待的方法无论如何都要这样做),等等。
是
换句话说,async
/ await
允许从异步角度编写代码。也就是说,代码可以“异步等待”(await
)操作完成,然后定义自己的异步操作(从async
方法返回的任务,表示该方法的执行)。