2011-05-31 30 views
36

Microsoft .NET Base Class Library提供了幾種創建線程並啓動它的方法。基本上,調用與其他提供相同類型服務的調用非常相似:創建一個表示執行流(或更多)的對象,爲其分配一個代表要執行的執行流的委託,並最終根據委託簽名取決於對象作爲參數。Thread.Start()與ThreadPool.QueueUserWorkItem()

那麼,有兩種方法(主要):

1)使用System.Threading.Thread類。

Thread curr = new Thread(myfunction); /* In a class, myfunction is a void taking an object */ 
curr.Start(new Object()); /* Or something else to be downcast */ 

2)使用System.Threading.ThreadPool類。

ThreadPool.QueueUserWorkItem(myfunction, new Object()); /* Same philosophy here */ 

是否有任何特殊原因爲什麼我應該使用1)或2)?性能原因?模式?什麼是最好的方法?

我有一種感覺,答案是:「依情況而定」。你能否列舉出一種方法比另一種更好的情況?

+0

http://stackoverflow.com/questions/1506838/backgroundworker-vs-background-thread/1507337#1507337 – 2011-05-31 20:13:47

回答

42

開始一個新的線程可能是一個非常昂貴的操作。線程池重用線程,從而分攤成本。除非需要專用線程,否則線程池是推薦的方式。通過使用專用線程,您可以更好地控制線程特定的屬性,例如優先級,文化等。此外,您不應該在線程池上執行長時間運行的任務,因爲它會強制池產生其他線程。

除了你提到的選項,.NET 4還提供了一些很好的併發抽象。查看Task和Parallel類以及所有新的PLINQ方法。

+3

是否有演示如何「看」所有項目的時候線程池一個很好的參考完成/跟蹤進度? – jocull 2014-03-17 15:31:06

2

使用ThreadPool,您對線程系統的控制較少。這是一個權衡以簡化您的過程。如果您擁有ThreadPool所需的全部內容,則可以隨意使用它。如果你需要更多的線程控制,那麼你當然需要使用Thread類。

1

ThreadPool.QueueUserWorkItem()基本上用於即發即用的情況,當應用程序不依賴於操作是否完成時。

使用經典線程進行細粒度控制。

11

The Managed Thread Pool在不使用線程池時有一些非常好的指導原則。

根據我的經驗,當您需要持久的,專用的,長時間運行的線程時,您希望創建自己的線程。對於其他任何事情,請使用異步委託或類似QueueUserWorkItemBackgroundWorker或.NET 4.0的任務相關功能。

+1

QueueUserWorkItem?它不只是線程池? :) – 2013-05-08 13:45:22

5

在.NET 4.5.2中,他們添加了一個新方法:HostingEnvironment.QueueBackgroundWorkItem

這似乎是ThreadPool.QueueUserWorkItem的替代方案。這兩種行爲類似,但在ASP.NET工作時,有使用新的方法,一些不錯的優勢:

的HostingEnvironment.QueueBackgroundWorkItem方法可以讓你 賽程小背景的工作項目。 ASP.NET跟蹤這些項目,並且 可以防止IIS突然終止工作進程,直到完成所有 後臺工作項目。在ASP.NET託管應用程序域之外,不能將此方法稱爲 。

相關問題