2010-06-15 44 views
25

.NET 4.0中的TaskFactory.StartNew顯然是用來代替ThreadPool.QueueUserWorkItemaccording to this post, anyway)。我的問題很簡單:有誰知道爲什麼?TaskFactory.StartNew vs ThreadPool.QueueUserWorkItem

請問TaskFactory.StartNew有更好的表現嗎?它使用更少的內存嗎?還是主要用於Task課程提供的附加功能?在後一種情況下,StartNew是否可能有表現比QueueUserWorkItem

在我看來,這StartNew實際上會潛在地使用內存比QueueUserWorkItem,因爲它返回一個Task對象與每一個電話,我可以預料,導致更多的內存分配。

無論如何,我很想知道哪個更適合高性能場景。

回答

2

僅僅從外觀上看,Task類被設計用於處理.Net 4中的新並行功能。它看起來也可以在開始/創建任務時直接使用ActionAction<T>。儘管如此,基於對文檔的討論,這完全是100%的猜測:)。

7

性能是...取決於。如果您正在執行大量並行任務,那麼.net 4任務的性能會更好,併爲您提供更加細緻的控制(更強大的取消功能,同時等待多個任務的能力,創建父/子任務關係的能力,以及指定LongRunning等..等..)

此外,指定您自己的TaskScheduler的能力意味着您可以自定義它以滿足您的需求。內置的任務調度器比舊的ThreadPool具有更多的多核意識。

至於使用更多的內存。每個線程保留至少1MB的內存,用於存儲任務對象的微小數量是無關緊要的。我真的會認爲這是你最後的擔心。

+0

AFAIK默認TaskScheduler使用ThreadPool,並且當您需要多核支持時,它們之間沒有區別。這傢伙甚至做了一些測試:http://stackoverflow.com/a/5219311/152291 – prostynick 2013-07-19 10:11:11

6

TaskFactory.StartNew更適合高性能場景。

您可以通過System.Threading.Tasks中的一組類以及進入其設計的注意事項+並行循環和選項的集成來獲得生產效益。

由於System.Threading.Tasks建立在線程池中的工作之上,對於局部性(當它很重要)更好時,您也將獲得性能優勢。

-Rick

+0

嗨瑞克,你可以告訴我,當我使用Task.Factory.StartNew,這是否需要線程從池中,我有在我的游泳池中減少1個線程?謝謝 – 2016-03-16 09:52:18

+1

Task.Factory.StartNew將使用.net線程池,所以是線程將來自池 – Rick 2016-03-16 16:53:09

+0

有沒有什麼辦法可以啓動不會從線程池中取出的新線程? – 2016-03-17 16:52:42

相關問題