考虑以下代码:
public static void Run() {
DoStuffAsync();
}
public static async Task DoStuffAsync() {
PerformCalc();
await DoLongTaskAsync();
PerformAnotherCalc();
}
假设我叫
Run()
。关于行为,我有几个问题:PerformCalc()
的线程相同的线程上同步调用Run()
吗? DoLongTaskAsync()
?换句话说,是否可以在PerformAnotherCalc()
完成之前调用DoLongTaskAsync()
? DoStuffAsync()
之前返回DoLongAsyncTask()
方法吗? 最佳答案
异步方法总是开始同步运行。魔术发生在await
上,但仅当给await
给出了尚未完成的Task
时才发生。
在您的示例中,这就是您调用Run()
时将发生的情况:
DoStuffAsync()
PerformCalc()
DoLongTaskAsync()
DoLongTaskAsync()
是真正的异步操作并返回不完整的Task
,则await
执行其工作,而DoStuffAsync()
返回不完整的Task
到Run()
。 Run()
完成。 DoLongTaskAsync()
完成时,DoStuffAsync()
恢复,并跳转到PerformAnotherCalc()
。 所有这些都可以在同一线程上发生。
因此,回答您的问题:
async
方法,则可能最终会消失并在其他线程上执行操作。但是它将在同一线程上同步启动。 DoLongTaskAsync()
将被异步调用,但是PerformAnotherCalc()
不会在DoLongTaskAsync()
完成之前被调用,因为您使用了await
。 await
的工作方式。它将返回不完整的Task
(即,仅当DoLongTaskAsync()
是真正的异步并且返回不完整的Task
时)。然后,一旦DoLongTaskAsync()
完成,就停止执行DoStuffAsync()
。