2015-07-22 119 views
6

我有多個任務返回相同的對象類型,我想使用Task.WhenAll(new[]{t1,t2,t3});調用並讀取結果。從Task.WhenAll獲得結果

當我嘗試使用

Task<List<string>> all = await Task.WhenAll(new Task[] { t, t2 }).ConfigureAwait(false); 

我得到一個編譯錯誤

無法隱式轉換類型 '無效' 到 'System.Threading.Tasks.Task<System.Collections.Generic.List<string>>

兩個任務都調用類似的方法來此。

private Task<List<string>> GetFiles(string path) 
{ 
    files = new List<string>(); 
    return Task.Run(() => 
    { 
     //remove for brevity 
     return files; 
    }); 
} 
+0

能否請您澄清[WhenAll]什麼樣的MSDN的一部分(https://msdn.microsoft.com/en-us/library/hh194766%28v=vs.110%29.aspx)不明確?會使問題更容易回答。 –

+0

其實沒有一篇文章不清楚。什麼是不明確的是這個空白來自哪裏。 – user3373870

+0

我看到了 - 正如Mike Hixson指出的那樣,您有'Task'(任務不返回值)列表而不是'Task ' - 因此等待'void'中的結果。通常你只是不使用快捷數組語法指定類型來避免這樣的問題 - 「ask.WhenAll(new [] {t,t2})...'。或者正確使用類型化的列表/任務數組,如MSDN示例 - 'var tasks = new List >();'。 –

回答

5

看起來像使用的是不返回值的WaitAll()的重載。如果您進行以下更改,它應該可以工作。

List<string>[] all = await Task.WhenAll(new Task<List<string>>[] { t, t2 }) 
           .ConfigureAwait(false); 
+3

或者僅僅是'List [] all = await Task.WhenAll(t,t2).ConfigureAwait(false);' –

2

WhenAll的返回類型是一個任務,其結果類型是個別任務的結果類型的數組,你的情況Task<List<string>[]>

當在的await表達式中使用,任務將是「展開「轉換爲其結果類型,這意味着」全部「變量的類型應爲List<string>[]