Task.WhenAll not faster than foreach



我有很长的工作

var works = ...
List<FormatObject> ret = new List<FormatObject>();
foreach (var w in works)
{
l.AddRange(await Info.GetInfo(w));
}
return Ok(ret);

大约花了 76 秒。

我尝试使用并行 Task.WhenAll:

var works ...
var ret = await Task.WhenAll(works.Select(Info.GetInfo));
return Ok(ret);

这也花了大约 76 秒。所以 Task.WhenAll 并不比 foreach 循环快。我认为 Task.WhenAll 并行完成工作,所以应该比按顺序完成的 foreach 更快。我错了什么?如何并行执行我的工作并在一秒钟内返回结果?

这与WhenAll

完全无关。 您调用了Info.GetInfo很多次,并且您以这样一种方式调用它,即您开始后续调用,而无需完成先前的调用。 然后,在启动所有这些操作后,您可以使用WhenAll在它们全部完成时收到通知。

工作能否并行完成,完全取决于Info.GetInfo的实施。 如果该操作的内部实现(无论它是什么)都不允许多个调用并行执行生产性工作(可能通过使用异步同步机制),那么一次运行一大堆调用不会加快程序的速度。 另一种可能性是该方法实际上不是异步的(即使它的签名表明它应该是异步的),并且在工作完成之前,它实际上可能不会将Task返回给您,而不是快速返回Task并在以后执行工作,因为它应该这样做。

最新更新