有可能做这样的事情吗?还是危险/不好的做法?如果不好的话,还有另一种解决方法呢?

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/

10-13 06:27