[英]C# Nesting asynchronous methods
是可以做这样的事情还是危险/不良做法? 如果它不好,那么另一种方法是什么呢?
void methodA ()
{
while (something) {
// do stuff
methodB();
}
}
async Task methodB()
{
bool b = await methodC();
// do something with b
}
async Task<bool> methodC()
{
await Task.Delay(1000);
}
我试图做到的,是对methodA
能够做的东西,而methodC
是在IO等待。 因此,与此我希望methodC
将返回methodB
而忙碌,因为methodB
等待答案,它将返回到methodA
,在那里methodA
可以继续工作的东西,也许调用methodB
再次
是的,这是标准做法。
async Task methodA()
{
while (something)
{
Task b = methodB();
// do stuff
await b;
}
}
需要注意的是,您在此处引入了并发性,因此您需要确保在A执行时B执行时没有任何线程问题。
您可以完全接受等待MethodA中的MethodB(只要您在MethodA中执行其他操作之前实际上不需要完成MethodB并且您要小心避免竞争条件)。 还有一些其他选择。
您可能想要查看Task.ContinueWith 。
这是我非常喜欢的第二种选择:
List<Task> tasks = new List<Task>();
while (something) {
// do stuff
// This doesn't actually wait for methodB - it just keeps going
Task methodBTask = methodB();
tasks.Add(methodBTask);
}
// Wait for all of the tasks we started to complete
await Task.WhenAll(tasks);
// ...
我认为这应该做你想要的,并且不会出现竞争条件。 基本上,这将启动MethodB中的任何操作,无论你想要多少次,然后等待所有这些操作完成后,一直“排队”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.