我是异步编程的新手,我的问题可能看起来很傻.请问任何人,在下面的伪代码示例中解释异步调用是如何工作的?
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();
}
Run Code Online (Sandbox Code Playgroud)
据我所知,该程序的工作原理如下
我的问题是
谢谢
以上步骤顺序是否正确?
没有.
正确的顺序是
请注意,MyMethod返回的任务永远不会正常完成; 如果这些任务中的任何一个抛出异常,则异常完成.为简单起见,我忽略了示例中异常延续的检查,因为没有异常处理.
在Method1()和Method2()完成工作后,有哪些方法可以控制?
在Method2 返回的任务完成后,Method1的其余部分最终获得控制权.在Method1返回的任务完成后,MyMethod 最终获得控制权.计划延期的确切细节取决于代码运行的上下文; 如果它们位于表单的UI线程上,那么它们与Web服务器上的工作线程非常不同.
如果LongRunMethod()运行时间超过10000毫秒会发生什么?
我想你的意思是如果LongRunMethod返回的任务没有完成超过十秒钟会发生什么.那时没有什么特别有趣的事情.直到LongRunMethod的任务完成后才开始延迟.你等待那个任务.
我认为你从根本上不明白"等待"意味着什么.您似乎认为"等待"意味着"异步启动此代码",但这根本不是什么意思.代码已经假设是异步的.Await 管理异步; 它不会创造它.
相反,等待是任务的操作员,这意味着如果这个任务完成,那么继续; 如果此任务未完成,则将该方法的其余部分注册为该任务的继续,并尝试通过返回给您的调用者来查找此线程上的其他一些工作.
在等待任务完成之前,没有代码在await之后执行; await意味着异步等待任务完成.它并不意味着"异步启动此代码".Await用于声明异步工作流中的哪些点必须等待任务完成才能继续工作流.这就是它在名称中"等待"的原因.
| 归档时间: |
|
| 查看次数: |
574 次 |
| 最近记录: |