【问题标题】:Will Task.WhenAll() make any difference for the speed of execution? [duplicate]Task.WhenAll() 会对执行速度产生影响吗? [复制]
【发布时间】:2020-12-24 20:42:45
【问题描述】:

考虑以下 C# 代码:

var task1 = GetSomethingAsync();
var task2 = GetSomethingElseAsync();
await Task.WhenAll(task1, task2);  //is this required?
var something = await task1;
var somethingElse = await task2;

Task.WhenAll() 是否对执行速度有任何影响(而不是如何抛出任何错误)?如果没有,有什么理由让我无论如何都应该拥有它?

更新:

正如一些人正确指出的那样,我应该使用 WhenAll() 而不是 WaitAll() - 我已经更新了问题。但是我仍然不清楚答案 - 是否有理由拥有WhenAll()? Why should I prefer single 'await Task.WhenAll' over multiple awaits? 这里的答案之一是关于快速通道异步方法。如果我的异步方法是快速通道,它会有所作为吗?我主要关心执行时间,即如果没有WhenAll(),我的两个调用是否有可能按顺序执行。但也很高兴知道是否有任何其他原因使用WhenAll()。

【问题讨论】:

  • 你混合了两种不同的做事方式。您只能在异步方法中等待。 Task.WaitAll 更多用于阻塞线程直到所有任务完成。 await 将启动一个任务并等待结果,阻塞直到每个任务完成。所以在 task1 完成之前 task2 甚至不会启动。

标签: c# async-await


【解决方案1】:

WaitAll,或更现代的WhenAll,将等待这两个任务完成或出错。

var task1 = GetSomethingAsync(); // starts task
var task2 = GetSomethingElseAsync(); // starts task

var something = await task1; // wait until the first finishes
var somethingElse = await task2; // wait until the second finishes

现在,你只是有一个语义问题。

你请2个朋友独立完成一个任务,你可以

  • 等第一个回来再等第二个回来
  • 或者等待两者都回来。

无论哪种方式,您都需要等到两个任务都完成。 WaitAllWhenAll 在完成这两个任务所需的速度方面不会有任何不同(因为它们已经独立运行)。

但是,请注意,还有其他差异,尽管它们与速度无关

如果您直接等待该方法,则例外情况

await GetSomethingAsync(); 
await GetSomethingElseAsync();

这些行按顺序执行,因此您需要将完成每个任务所需的时间相加。

最后,正如 41686d6564WaitAny()WhenAny() 所指出的,只需要等待第一个任务完成(而不是全部),这在某些情况下可能是可取的。

【讨论】:

  • 为了完整起见,这里可能还值得一提Task.WaitAny().WhenAny()。不过很好的解释!
  • 在第一个代码块中,在调用 await 之前是否 start 实际开始运行?还是您只是得到一个指向尚未开始的任务的指针。
  • @Joe_DM 任务开始热
猜你喜欢
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 2011-11-14
相关资源
最近更新 更多