集合初始化程序的异步填充

时间:2015-11-26 12:11:19

标签: 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};
    }
}

1 个答案:

答案 0 :(得分:2)

  

我的直觉是否正确?

你的直觉是对的。所有集合初始化程序都会调用集合的h1 {font-size:0px} //it will also work in case display:inline-block of div's 方法。这意味着您的代码已翻译为:

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