2015-11-26 192 views
2

的异步人口,我想填充集合使用集合初始化,将调用异步方法:集合初始化

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}; 
    } 
} 
+2

我的直觉是否正确?是。 ;) –

回答

2

是我的直觉正确的吗?

你的直觉是对的。所有集合初始化程序都会调用集合的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); 
} 
+3

''返回等待Task.WhenAll()'' - 很好 –

+0

我认为消除返回就够了。 –

+0

@ M.kazemAkhgary你是什么意思? –