我正在使用 SignalR。Hub 上的函数通常返回一个任务。我现在有一个功能,可以将连接添加到一组组。我想返回一个代表所有这些任务的任务。
我为此找到了一个完美的函数:Task.WhenAll。然而,这是 .NET 4.5 中的一个新功能,我仍然停留在 .NET 4 上。
因此,我决定编写自己的版本,直到我们可以迁移到 .NET 4.5。因为在多线程(例如线程池的东西)方面经常有一些警告,我不确定我的实现是否正确:
public static Task WhenAll(IEnumerable<Task> tasks)
{
return Task.Factory.StartNew(() => Task.WaitAll(tasks.ToArray()));
}
在功能上,我认为它可以工作,但是我没有为新任务获得额外的阻塞线程吗?还是这是不可避免的?
编辑:这是我将如何与 SignalR 一起使用它:
public static Task Add(this IGroupManager groupManager, string connectionId,
IEnumerable<string> groups)
{
return WhenAll(groups.Select(group => groupManager.Add(connectionId, group)));
}