繁体   English   中英

C#嵌套异步方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM