有可能做这样的事情吗?还是危险/不好的做法?如果不好的话,还有另一种解决方法呢?
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
在IO上等待时可以执行操作。因此,我希望在忙碌时methodC
会返回methodC
,并且由于methodB
等待答案,所以它将返回methodB
,在这里methodA
可以继续处理某些东西,甚至可以调用再一次 最佳答案
对于您不等待MethodA中的MethodB(只要您实际上不需要MethodB完成,然后再在MethodA中进行其他操作并且您要小心避免出现竞争状况),这可能是完全可以接受的。但是,还有其他一些选择。
您可能需要查看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中启动任意次数的操作,无论您希望执行多少次,然后在它们全部“排队”后等待它们完成。
关于c# - C#嵌套异步方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41149927/