【问题标题】:Task.WhenAll() - cannot add collection of tasks - async/awaitTask.WhenAll() - 无法添加任务集合 - 异步/等待
【发布时间】:2017-09-24 09:14:48
【问题描述】:

我正在尝试使用 async/await 并行运行长时间运行的任务并同时运行它们,但我无法将任务添加到任务集合并将它们添加到 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);

【问题讨论】:

    标签: async-await


    【解决方案1】:

    我正在尝试使用 async/await 来...同时运行它们

    您可以使用Task.WhenAll 进行异步并发。

    上述长时间运行的任务此时已经在运行,所以不能先将它们存储在一个集合中,然后将它们放入 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&lt;T&gt;

    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);
    

    其中任何一个都应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 2014-09-06
      • 2013-02-10
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      相关资源
      最近更新 更多