2017-04-26 47 views
0

我試圖使用async/await並行運行長時間運行的任務並同時運行它們,但我無法將任務添加到任務收集並將它們添加到Task.WhenAll(),因爲它立即開始運行任務。我有以下代碼:Task.WhenAll() - 無法添加任務集合 - 異步/等待

var task1 = _bll.longRunningTask1().ConfigureAwait(false); 
var task2 = _bll.longRunningTask2().ConfigureAwait(false); 

以上長時間運行的任務已經由這一點上運行,所以不能先其存儲在一個集合中,然後把它們放到Task.WhenAll(),然後運行它們。 這樣做是爲了讓他們進入集合並僅通過Task.WhenAll()運行它們的正確方法是什麼?

List<Task> tasks = new List<Task>(); 
tasks.Add(task1); 
tasks.Add(task2); 

await Task.WhenAll(tasks); 

回答

3

我試圖使用異步/等待對該......同時

運行它們可以使用Task.WhenAll做異步併發。

上述長時間運行的任務已經在運行,因此無法先將它們存儲在集合中,然後將它們放入Task.WhenAll()中,然後運行它們。

Task.WhenAll不運行任務。僅僅(異步)等待多個任務完成。

什麼是做這個

這是代碼的正確方式,你已經有了:

var task1 = _bll.longRunningTask1().ConfigureAwait(false); 
var task2 = _bll.longRunningTask2().ConfigureAwait(false); 
await Task.WhenAll(task1, task2).ConfigureAwait(false); 

這是相當多的相當於明確創建List<T>

var task1 = _bll.longRunningTask1().ConfigureAwait(false); 
var task2 = _bll.longRunningTask2().ConfigureAwait(false); 
List<Task> tasks = new List<Task>(); 
tasks.Add(task1); 
tasks.Add(task2); 
await Task.WhenAll(tasks).ConfigureAwait(false); 

這些都應該工作得很好。