簡體   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