2015-11-26 188 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你是什麼意思? –