Task.WhenAll并不比foreach

时间:2017-09-13 17:58:45

标签: c# task-parallel-library

我有一份很长的工作

    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更快地执行。我错了什么?如何并行执行我的工作并在一秒钟内返回结果?

1 个答案:

答案 0 :(得分:3)

这与WhenAll完全没有关系。你曾多次调用Info.GetInfo,并且你调用它的方式是你开始后续调用而不需要先前的调用完成。然后,在启动所有这些之后,使用WhenAll在完成所有操作后通知您。

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