【发布时间】:2012-09-12 23:17:26
【问题描述】:
我正在使用 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)));
}
【问题讨论】:
-
出于好奇,您是否尝试过反编译或查看 .NET 4.5 版本的源代码以了解您的接近程度? (referencesource.microsoft.com/netframework.aspx)
-
不,我没有这样做。实际上我从来没有这样做过。立即下载 JustDecompile。
-
我正在下载源代码,希望已经为您解答,但是下载需要一点时间...
-
哇,看来我还差得很远:P。在我看来,这个实现类似于 svick 在 ContinueWhenAll 的实现中看到的。 IE。为每个任务安排继续。然而,这是一个相当复杂的功能,我没有得到所有正在发生的事情。
标签: c# multithreading task-parallel-library