集合初始化器的异步填充

雅各布·科内基(Jakub Konecki)

我想使用将调用异步方法的集合初始化器来填充一个集合:

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};
    }
}
尤瓦尔·伊茨恰科夫(Yuval Itzchakov)

我的内心感觉是否正确?

你的直觉是正确的。集合初始化程序所做的全部工作就是调用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);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章