.NET 4中Task.WhenAll()的等效方法是什么?

16
在.NET 4中,是否有与.NET 4.5的System.Threading.Tasks.Task.WhenAll()相对应的功能?
目标是将多个异步任务包装成一个单一的任务,在其所有组成部分任务完成时完成。

@L.B Parallel.Invoke 不是针对 Task 进行操作,而是针对 Action 进行操作。 - Monroe Thomas
@MonroeThomas,那么使用Actions是被禁止的吗?正如您所看到的,我是作为评论而不是答案发布的。 - L.B
4
我认为在这里使用"Actions"是不合适的,因为OP明确表示了异步任务,并通过指定只接受"IEnumerable<Task>"的"Task.WhenAll"行为和签名来加强了这一点。 "Parallel.Invoke"没有返回一个"Task",这也是OP所寻找的。 - Monroe Thomas
1
你能否只使用异步目标包?不确定它是否包含那个功能。 - James Manning
3个回答

27

在.NET Framework 4.0中,当使用Visual Studio 2010时,可以与已安装的AsyncCTP一起使用WhenAll和WhenAny,或者在使用Visual Studio 2012时,可以与Async Targeting Pack一起使用。

然后,在TaskEx类型上提供了WhenAll和WhenAny方法。


7
我认为这应该是最佳答案。 - Gary McGill
2
我无法找到WhenAll,即使我已经安装了VS 2010的AsyncCTP。 - Faisal Silitonga

17

我认为.Net 4.0 内置的功能中,与之最接近的是 ContinueWhenAll()。您可以将continuationAction设置为简单的tasks => tasks 并使用返回的 Task

出于性能原因,建议您使用 TaskContinuationOptions.ExecuteSynchronously 进行操作。


1
@MonroeThomas,感谢你提供的那个优秀链接——Task.Factory的扩展非常方便,而其他并行编程示例看起来很有趣。 - kpozin

2
尝试在另一个任务中等待Task.WaitAll()。 使用LINQ扩展方法ToArrayIEnumerable<Task>转换为Task[]
Task WhenAll(IEnumerable<Task> tasks)
{
    return Task.Factory.StartNew(() => Task.WaitAll(tasks.ToArray()));
}

同意。你的答案更好。谢谢! - Monroe Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接