有没有一个通用的Task.WaitAll?

我开始几个并行的任务,像这样:

var tasks = Enumerable.Range(1, 500) .Select(i => Task.Factory.StartNew<int>(ProduceSomeMagicIntValue)) .ToArray(); 

然后join

 Task.WaitAll(tasks); 

在最后一行,我得到一个蓝色波浪标记在tasks下,并带有警告信息:

 从Task []到Task []的同variables数组转换 
写操作可能导致运行时exception。 

我明白为什么我会收到这个消息,但有没有办法解决这个问题呢? (例如,像Task.WaitAll()的通用版本?)

你可以创build一个扩展方法来做到这一点。

我不知道WaitAll的具体实现,但我们可以假设它等待每个项目完成:

 static class TaskExtensions { public static void WaitAll<T>(this Task<T>[] tasks) { foreach (var item in tasks) { item.Wait(); } } } 

然后从当前的代码中调用:

 tasks.WaitAll(); 

编辑

实际的实现有点复杂。 我从这个答案中省略了代码,因为它相当长。

http://pastebin.com/u30PmrdS

您可以修改它以支持通用任务。

Task.WaitAll的通用方法意味着所有任务将不得不返回相同的types,这将是非常有限的有用性。 写这样的东西可以手动完成(请参阅Bas Brekelmans的答案),但是这不会允许ContinueWith或取消而没有很多的工作。

一个简单的解决scheme,如果你不使用数组的其他任何东西是

  .ToArray<Task>(); 

即使有警告,我也确定这是一个安全的操作,但是如果你真的想要解决这个问题,比创build自己的实现更好的select只是将您的tasks参数转换为它想要的types:

 Task.WaitAll(tasks.Cast<Task>().ToArray()) 

这为我消灭了蓝色的波浪,让我保持我的tasksvariables通用,并不强迫我创造了很多新的可怕的代码,这是最终不必要的。