我是异步编程的新手,我的问题可能看起来很傻。请问任何人,在下面的伪代码示例中解释异步调用是如何工作的?
public async Task MyMethod()
{
while(true)
{
await Method1();
//do something in MyMethod
await Task.Delay(10000);
}
}
private async Task Method1()
{
//do something in Method1 before await
await Method2();
//do something in Method1 after await
}
private async Task Method2()
{
//do something in Method2 before await
await LongRunMethod();
}
根据我的理解,程序就像这样工作
我的问题是
谢谢
答案 0 :(得分:6)
以上步骤顺序是否正确?
没有
正确的顺序是
请注意,MyMethod返回的任务永远不会正常完成;如果这些任务中的任何一个抛出异常,则异常完成。为简单起见,我忽略了示例中异常延续的检查,因为没有异常处理。
在Method1()和Method2()完成工作后,哪些方法可以控制?
Method2 的其余部分最终在Method2返回的任务完成后获得控制权。在Method1返回的任务完成后,MyMethod 最终获得控制权。计划延期的确切细节取决于代码运行的上下文;如果它们位于表单的UI线程上,那么它们与Web服务器上的工作线程非常不同。
如果LongRunMethod()运行时间超过10000毫秒会发生什么?
我认为你的意思是如果LongRunMethod返回的任务没有完成超过十秒钟会发生什么。那时没有什么特别有趣的事情。直到LongRunMethod的任务完成后才开始延迟。 您正在等待该任务。
我认为你从根本上不明白“等待”是什么意思。您似乎认为“等待”意味着“异步启动此代码”,但这根本不是什么意思。通过假设,代码已经异步。等待管理异步;它不会创建它。
相反,等待是任务的操作员,如果此任务完成则意味着然后继续;如果此任务未完成,则将该方法的其余部分注册为该任务的延续,并尝试通过返回给您的调用者来查找此线程上的其他工作。
在等待任务完成之前,await之后没有代码执行; await意味着异步等待任务完成。它并不意味着“异步启动此代码”。等待是声明异步工作流中的哪些点必须等待任务完成才能继续工作流。这就是它在名字中“等待”的原因。