我有以下代码行,以了解async-await
并暂停直到等待任务完成。
public async Task<string> WaitAsynchronouslyAsync()
{
var results = await WaitAsync();
Console.WriteLine($@"I am not waiting");
return results;
}
public async Task<string> WaitAsync()
{
await Task.Delay(10000).ConfigureAwait(false);
return "Async programming suspension point demo.";
}
await
运算符暂停执行,直到WaitAsync()
(延迟10秒)方法的工作完成。
与此同时,我期待Console.WriteLine($@"I am not waiting");
应该将文本写入输出窗口,直到等待任务完成,因为控件将返回给WaitAsync()
的调用者。当任务完成执行时,await表达式将计算字符串("Async programming suspension point demo."
)。
我在这里与悬浮指针与调试指针混淆了吗?
答案 0 :(得分:7)
await运算符暂停执行,直到WaitAsync()方法的工作完成。
正确。
我期待着Console.WriteLine($ @“我不等待”);应该将文本写入输出窗口,直到等待任务完成,因为控制权返回给WaitAsync()的调用者。
为什么呢?您刚才说 await运算符暂停执行直到工作完成。这项工作将在另外10秒内完成;工作是等待十秒。在WaitAsync
执行return
之前,WaitAsynchronouslyAsync
的工作尚未完成。
正确的做法是await
允许其调用者在此方案中运行。
您已正确说明await
的含义,但您似乎并未完全内化后果。 text-overflow:ellipsis
检查其操作数以查看任务是否完成。如果是,则获取任务的结果并继续该方法。如果不是,那么该方法的其余部分将作为该任务的继续进行注册,并且产生控制以便可以在其他地方完成更多工作。将来,当任务完成时,该方法的其余部分将被安排执行。
答案 1 :(得分:4)
await
表示“等到异步执行完毕”,在提供的Task
完成执行之前,您的函数将不会继续。
如果您改为说以下内容,则不会等待:
var results = WaitAsync();
Console.WriteLine($@"I am not waiting");
return await results;
或者更简洁,从签名中删除async
,然后您就可以return results;
。
答案 2 :(得分:3)
操作顺序将如下所示:
WaitAsynchronouslyAsync
WaitAsynchronouslyAsync
来电WaitAsync
WaitAsync
调用Task.Delay(10000).ConfigureAwait(false)
,生成Task
。WaitAsync
向其来电者Task
返回新的WaitAsynchronouslyAsync
,该广告将在稍后完成WaitAsynchronouslyAsync
等待来自WaitAsync
的任务,然后返回它的来电,提供表示何时完成的Task
。 Task.Delay
结束,所以WaitAsync
的继续发生火灾,从它停止的地方开始。WaitAsync
返回字符串,填写Task
。WaitAsynchronouslyAsync
现在可以继续,因为从Task
返回的WaitAsync
已经完成。它将继续将文本打印到控制台。WaitAsynchronouslyAsync
完成它的任务,让任何有任何设置的人在完成后运行。