【问题标题】:await Task.WhenAll() vs Task.WhenAll().Wait()等待 Task.WhenAll() 与 Task.WhenAll().Wait()
【发布时间】:2023-03-26 00:32:01
【问题描述】:

我有一个生成任务数组的方法 (See my previous post about threading),在此方法结束时,我有以下选项:

await Task.WhenAll(tasks); // done in a method marked with async
Task.WhenAll(tasks).Wait(); // done in any type of method
Task.WaitAll(tasks);

基本上我想知道两个whenalls 之间的区别是什么,因为第一个似乎不像第二个那样等到任务完成,但我不想使用第二个,如果它不是异步的。

我已经包含了第三个选项,因为我知道这将锁定当前线程,直到所有任务都完成处理(看似同步而不是异步) - 如果我对此有误,请纠正我

带有等待的示例函数:

public async void RunSearchAsync()
{
    _tasks = new List<Task>();
    Task<List<SearchResult>> products = SearchProductsAsync(CoreCache.AllProducts);
    Task<List<SearchResult>> brochures = SearchProductsAsync(CoreCache.AllBrochures);

    _tasks.Add(products);
    _tasks.Add(brochures);

    await Task.WhenAll(_tasks.ToArray());
    //code here hit before all _tasks completed but if I take off the async and change the above line to:

    // Task.WhenAll(_tasks.ToArray()).Wait();
    // code here hit after _tasks are completed
 }

【问题讨论】:

  • 第二个选项不是异步是什么意思?您触发的任务将在不同的线程下处理,Wait 和 WaitAll 影响主线程。
  • @TMcKeown 啊,好吧,所以我认为 await 的目的是等待 whenall 中的所有进程也完成运行,然后再转移到它之后的任何代码
  • @Pete:“等待 Task.WhenAll”应该可以工作。确保您使用 .NET 4.5 并在 web.config 中将 targetFramework 设置为 4.5。
  • @Pete:你确定代码在 await Task.WhenAll(_tasks.Toarray()) 之后命中。我尝试了您的示例,但它要等到所有任务完成。

标签: multithreading async-await c#-5.0


【解决方案1】:

await 将返回给调用者,并在等待的任务完成时恢复方法执行。

WhenAll创建一个任务 **When All* 完成所有任务。

WaitAll会阻塞创建线程(主线程),直到所有任务完成。

【讨论】:

  • 所以 await Task.WhenAll 和 Tasks.WhenAll().Wait() 应该没有区别,因为两者都应该等到 whenall 中的所有任务都完成(因为它将创建新任务然后等到新任务完成)但是根据我的编辑,我在它们之间有不同的行为,后者的行为更像是 WaitAll
  • @TMcKeown await Task.WhenAll(...);应该等待WhenAll返回的Task,为什么说OPs代码中的await调用没有使用返回的任务呢?非常感谢您的解释。
  • 我认为这是不正确的。我删除了该评论。
猜你喜欢
  • 2016-08-22
  • 2018-05-11
  • 2018-08-26
  • 2023-04-03
  • 1970-01-01
  • 2016-01-30
  • 2012-11-06
  • 2021-07-17
  • 2012-08-14
相关资源
最近更新 更多