繁体   English   中英

这是.NET 4.5的WhenAll的正确.NET 4实现吗?

[英]Is this a correct .NET 4 implementation for .NET 4.5's WhenAll?

我正在使用SignalR。 Hub上的功能通常返回一个Task。 我现在有一个函数可以添加一组连接。 我想返回一个代表所有这些任务的任务。

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

你的解决方案可以正常工作,但你是正确的,它会一直阻塞一个线程。

我认为在.Net 4.0上有效实现WhenAll()的最简单方法是使用ContinueWhenAll() 它在集合中的所有Task完成后执行操作,并返回表示该操作的Task 由于我们只想要那个Task ,我们不需要动作,传递一个空的lambda会起作用:

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

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

作为一个重要的额外奖励,您可以在.Net 4.0代码中使用async / await :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM