c# - 集合初始值设定项的异步填充

标签 c# asynchronous async-await collection-initializer

我想使用将调用异步方法的集合初始值设定项来填充集合:

public class Diagnostics
{
    public async Task<IEnumerable<DiagnosticsInfo>> Get() => new List<DiagnosticsInfo>
    {            
        await GetDiagnosticsInfo1(),
        await GetDiagnosticsInfo2(),
        await GetDiagnosticsInfo3()
    };
}

目的是让所有 GetDiagnosticsInfoX() 方法并行执行。 我怀疑生成的代码将同步调用 GetDiagnosticsInfoX() 方法 - 它将在调用第二个调用之前等待第一个调用。

我的直觉正确吗?

如果是这样,我想我需要等待这样的所有任务:

public class Diagnostics
{
    public async Task<IEnumerable<DiagnosticsInfo>> Get()
    {
        var task1 = GetDiagnosticsInfo1();
        var task2 = GetDiagnosticsInfo2();
        var task3 = GetDiagnosticsInfo3();

        await Task.WhenAll(task1, task2, task3);

        return new List<DiagnosticsInfo> {task1.Result, task2.Result, task3.Result};
    }
}

最佳答案

Is my gut feel correct?

你的直觉是对的。集合初始值设定项所做的所有工作就是调用集合的 Add 方法。这意味着您的代码被翻译为:

public async Task<IEnumerable<DiagnosticsInfo>> Get()
{
    var list = new List<DiagnosticsInfo>();         
    list.Add(await GetDiagnosticsInfo1());
    list.Add(await GetDiagnosticsInfo2());
    list.Add(await GetDiagnosticsInfo3());
    return list;
}

使用Task.WhenAll将等待所有异步方法完成。然后您可以返回收到的数组:

public async Task<IEnumerable<DiagnosticsInfo>> Get()
{
    var task1 = GetDiagnosticsInfo1();
    var task2 = GetDiagnosticsInfo2();
    var task3 = GetDiagnosticsInfo3();

    return await Task.WhenAll(task1, task2, task3);
}

关于c# - 集合初始值设定项的异步填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33938396/

相关文章:

javascript - 设置异步请求结果时出现问题

c++ - 无堆栈 C++20 协程有问题吗?

multithreading - 异步、Task.Delay 和 HtmlHelper MVC 4

c# - 动态地向动态对象添加属性?

c# - 我应该在 c# 中使用静态函数吗?

c# - 事件工作簿更改时的事件

c# - C# 中的 Agent/MailboxProcessor 使用新的 async/await

频繁调用 BeginInvoke 时 C# 会降低 UI 性能

javascript - Node.js 在逐行 Readline 完成后执行

c# - 等待流的人口