【发布时间】:2017-09-07 22:29:12
【问题描述】:
我是异步编程的新手,我的问题可能看起来很傻。任何人都可以在下面的伪代码示例中解释异步调用是如何工作的吗?
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();
}
据我了解,程序是这样工作的
- MyMethod() 在无限循环中调用 Method1()
- Method1() 运行“在等待之前在 Method1 中做一些事情”
- Method1() 启动 Method2() 并将控制权返回给 MyMethod()
- MyMethod() 启动 10000 毫秒延迟并将控制权返回给其调用者
- Method2() 完成“在等待之前在 Method2 中做某事”,启动 LongRunMethod() 并将控制权返回给 MyMethod1()
- Method1() 完成“在等待后在 Method1 中做某事”。之后通过什么方法获得控制权?
- LongRunMethod() 完成工作
- Method2() 完成了它的工作。它是否将控制权返回给 Method1()?
- 10000 毫秒后,一切都从步骤 1 开始重复。
我的问题是
- 上述步骤顺序是否正确?
- 在 Method1() 和 Method2() 完成第 6 步和第 8 步的工作后,哪些方法会获得控制权?
- 如果 LongRunMethod() 运行时间超过 10000 毫秒会怎样?
谢谢
【问题讨论】:
-
你永远不会等待
_task。这是自找麻烦。 -
在 JS 中,
chainasync 方法而不是nesting它们是更好的做法...因为在嵌套时,您会失去控制...但是链接可以确保您的进程始终以相同的顺序运行。 stackoverflow.com/questions/25181984/… -
谢谢基里尔,我已经更改了代码。
-
实际上,这改变了您的问题 3 的答案。以前如果
LongRunMethod运行时间超过 10 秒,则将并行启动另一个调用,而现在无论多长时间,您都可以很好地顺序执行每种方法都需要。尽管如此,每个Task都需要在某个时候被await编辑。 -
一个更有趣的代码变体应该包括
await _taskafterawait Task.Delay(10000)。
标签: c# asynchronous