我有一份很长的工作
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更快地执行。我错了什么?如何并行执行我的工作并在一秒钟内返回结果?
答案 0 :(得分:3)
这与WhenAll
完全没有关系。你曾多次调用Info.GetInfo
,并且你调用它的方式是你开始后续调用而不需要先前的调用完成。然后,在启动所有这些之后,使用WhenAll
在完成所有操作后通知您。
是否能够并行完成工作完全基于Info.GetInfo
的实施。如果该操作的内部实现,无论它是什么,都不能允许多个调用并行地进行生产性工作(可能通过使用异步同步机制),那么一次运行它们将不会加快程序的速度。另一种可能性是该方法实际上并不是异步的(即使它的签名表明它应该是异步的)并且它可能实际上不会将Task
返回给你直到工作是完成,而不是快速返回Task
并在以后做它应该做的工作。