【发布时间】:2017-10-25 22:34:59
【问题描述】:
下面我引用Async and AwaitStephen Cleary写的文章中的代码sn-p及其相关解释如下。
public async Task DoSomethingAsync()
{
// In the Real World, we would actually do something...
// For this example, we're just going to (asynchronously) wait 100ms.
await Task.Delay(100);
}
异步方法的开头与任何其他方法一样执行。也就是说,它会同步运行,直到遇到“等待”(或引发异常)。
“await”关键字是事情可以异步的地方。 Await 就像一个一元运算符:它接受一个参数,一个可等待的(“等待”是一个异步操作)。 await 检查 awaitable 是否已经完成;如果 awaitable 已经完成,则该方法继续运行(同步地,就像常规方法一样)。
如果“await”看到可等待对象尚未完成,则它会异步执行。它告诉 awaitable 在完成时运行该方法的其余部分,然后从异步方法返回。
为了适应更一般的情况,让我将代码 sn-p 定义如下。
public async Task DoSomethingAsync()
{
AAA();
await BBBAsync;
CCC();
}
其中BBBAsync 是唯一的“可等待”操作或方法。
为了简单起见,假设我们在主应用线程中执行DoSomethingAsync。所以在我的理解中,
-
AAA()将始终同步执行。 -
无论如何调用
DoSomethingAsync(),BBBAsync()将始终异步执行。 -
CCC()可以异步或同步执行,具体取决于await运算符确定的结果。
在我看来,await 运算符总是发现等待的对象尚未完成,因为await 总是在BBBAsync() 开始之前出现。
问题
await 什么时候检查 awaitable?
【问题讨论】:
标签: c# .net multithreading asynchronous