这是一个正确的.NET 4的执行情况.NET 4.5的WhenAll?(Is this a corr

2019-09-22 16:26发布

我使用SignalR。 轮毂上的功能往往返回任务。 我现在有这将增加一堆组的连接的功能。 我想返回表示所有这些任务的任务。

我找到了一个完美的功能: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)));
}

Answer 1:

您的解决方案将正常工作,但你说得对,它会阻塞线程的全部时间。

我认为,最简单的方法能够有效地实现WhenAll()在.NET 4.0是使用ContinueWhenAll() 它执行时所有的操作Task从集合s的结束并返回一个Task表示行动。 因为我们想只是Task ,我们不需要的动作,传递一个空的λ将工作:

public static Task WhenAll(IEnumerable<Task> tasks)
{
    return Task.Factory.ContinueWhenAll(tasks.ToArray(), _ => {});
}


Answer 2:

当你的目标.NET 4.0,如果你可以使用VS2012,那么简单/更好的选择(恕我直言)是使用的NuGet安装异步针对包 ,然后你可以使用WhenAll( TaskEx.WhenAll在这种情况下,因为它不能修改是在4.0框架的任务)。

作为一个显著额外的奖励,然后你可以使用你的.NET 4.0的代码异步/ AWAIT以及:)



文章来源: Is this a correct .NET 4 implementation for .NET 4.5's WhenAll?