有没有一个通用的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();
编辑
实际的实现有点复杂。 我从这个答案中省略了代码,因为它相当长。
您可以修改它以支持通用任务。
Task.WaitAll的通用方法意味着所有任务将不得不返回相同的types,这将是非常有限的有用性。 写这样的东西可以手动完成(请参阅Bas Brekelmans的答案),但是这不会允许ContinueWith或取消而没有很多的工作。
一个简单的解决scheme,如果你不使用数组的其他任何东西是
.ToArray<Task>();
即使有警告,我也确定这是一个安全的操作,但是如果你真的想要解决这个问题,比创build自己的实现更好的select只是将您的tasks
参数转换为它想要的types:
Task.WaitAll(tasks.Cast<Task>().ToArray())
这为我消灭了蓝色的波浪,让我保持我的tasks
variables通用,并不强迫我创造了很多新的可怕的代码,这是最终不必要的。