C# 嵌套异步方法

标签 c# async-await

是否有可能做这样的事情,或者这是危险的/不好的做法吗?如果效果不好,还有什么解决方法?

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

最佳答案

不等待 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 中的任何操作,无论您想要执行多少次,然后等待它们全部“排队”后完成。

关于C# 嵌套异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41149927/

相关文章:

list - 在 forEach 循环中填充列表之前,我的异步调用正在返回

c# - c# 代码生成的 .xls 文件无法在 iPad 和 Android 平板电脑中打开

c# - 我如何处理自定义应用程序设置? Windows 10 UWP C#

c# - 为什么将 double.epsilon 添加到一个值会产生相同的值,完全相等?

javascript - 循环等待。 (再次)

c# - 如何连接异步枚举?

c# - 具有 AllowMultiple=true 的自定义 MEF ExportAttribute 导致重复

c# - 从 app.config c# 中读取所有键值

c# - 异步等待 : is the main thread suspended?

C# 异步任务 - 单元测试