我需要对Web服务进行一系列调用以获取一组节点计数。我并行地并行进行所有呼叫。之后,我开始了电话,我总结的结果,像这样:以任何顺序等待所有任务的短路
//pendingTasks is List<Task<int>>
int sum = 0;
foreach (var task in pendingTasks)
{
sum += await task;
if (sum > 100) break;
}
的突破是有,因为它超过100
首先关闭后,我并不关心具体的数量,是危险的像这样打破循环?离开未完成任务不好吗?它会造成任何类型的内存泄漏吗?
其次,个别呼叫相当不一致。如果第一次打电话的时间最长,我会讨厌它,即使所有后面的打电话总数超过100次,我也会等到最后一次打电话。如果单个结果返回,那么最好加上总和。为了收到他们的订单。我之前使用过WhenAll
,而且我很确定WhenAny
是我想要的,但我不太清楚如何在这种场景中使用它,我想在它们进来时处理多个场景,然后在它们结束时终止全做完了。
我喜欢你的实现,而不是为TaskCompletionSources使用'List'并同步访问,为什么不使用'BlockingCollection'?然后,您可以在开始时添加它们,并在每次完成任务时选择一个。 – Servy
+1。 Stephen Toub有[另一种方法](http://blogs.msdn.com/b/pfxteam/archive/2012/08/02/processing-tasks-as-they-complete.aspx)返回任务> [] ',这允许一些更高级的情况。但是我认为Jon的使用更容易。 –