2017-04-26 46 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); 

这些都应该工作得很好。