2010-04-24 48 views
29

我聽說.NET 4團隊已經在框架中添加了新的類,使得線程的工作變得更加容易。.NET 4中的多線程改進

基本上問題是運行.NET 4中添加多線程任務的新方法是什麼,它們設計用於什麼目的?

UPD:只是要清楚,我不是在尋找.NET 4的並行運行任務的一個的方式,我想找出所有的新的增加,有可能的話是什麼情況會他們每個是最適合..

回答

37

由於缺乏迴應,我決定評估下面的答案,我學到了...... 正如@Scott所說,.NET 4增加了Task Parallel Library,它增加了許多創新,新方法和並行的方法。

  • 的第一件事情提的是Parallel.ForParallel.ForEach方法,它允許開發人員來處理多個線程的多個項目。這種情況下的框架將決定需要多少個線程,以及何時創建新線程以及何時不需要。
    這是一種非常簡單直接的方式來並行化現有代碼,並增加一些性能提升。
  • 另一種方式,有點類似於以前的方法是使用PLINQ擴展。他們採用現有的枚舉,並使用並行的linq擴展器進行擴展。所以,如果你有一個現有的linq查詢,你可以很容易地將其轉換爲PLINQ。這意味着PLINQ枚舉上的所有操作也將利用多個線程,例如使用.Where子句過濾對象列表,現在將在多個線程中運行!
  • TPL中較大的創新之一是新的Task類。在某些方面,它可能看起來像已經熟知的Thread類,但它利用了.NET 4中的新線程池(與以前的版本相比已經有了很大的改進),並且功能比常規的Thread類。例如,您可以將任務鏈中間的任務只在前一個任務完成時啓動。關於Channel 9的屏幕錄像中的示例和深入說明
  • 要加強Task類的工作,我們可以使用BlockingCollection<>。這適用於您有生產者 - 消費者場景的情況。你可以有多個線程產生一些對象,這些對象將被消費者方法消費和處理。這可以通過任務工廠和阻塞集合輕鬆並行和控制。有用的截屏視頻,例如Channel 9
    這些還可以使用不同的後備存儲類(ConcurrentQueue,ConcurentStack,ConcurrentBag),它們都是線程安全的,並且在元素排序和性能方面有所不同。不同的示例和解釋video here
  • 已添加的另一個新事物(可能不是TPL的一部分,但無論如何幫助我們)是CountdownEvent類,它可以幫助我們完成「任務協調情景「(c)。基本上允許我們等待所有並行任務完成。截屏以實例的使用上Channel 9

你可以看到一些標記有第9頻道截屏和視頻的"Parallel Computing"

+0

是否有任何單一的生產者/單一消費者樣本代碼? – Xaqron 2010-10-21 19:36:50

15

是,.NET 4中,添加Task Parallel Library其中,在較高的水平,增加了支持:

  • Parallel.For和運行並行循環
  • 使用Parallel.InvokeTask
  • PLINQ(平行LINQ到對象)

接聽更新原來的問題創建或運行任務...

的TPL是優選的使用.NET編寫並行任務的方式4.您仍然可以自己創建線程池項目,並執行所有與以前相同的「手動」線程技術。需要記住的是,整個線程池(以及幾乎所有線程相關的)已被重寫,以利用TPL。這意味着即使你自己創建了一個線程池項目,你仍然會使用TPL,即使你不知道它。另外要記住的是TPL更加優化,根據可用處理器的數量,可以更適當地擴展。

至於知道他們每個人最適合的情況,沒有「銀彈」的答案。如果你以前排隊你自己的線程池項目(或者以其他方式做多線程),你可以修改你的代碼部分來使用TPL,而不會有任何後果。

對於並行循環或並行查詢之類的事情,您需要分析代碼和代碼的執行情況,以確定是否適合並行化。

+0

1爲TPL參考和一對夫婦的例子..但TPL是.NET中的一個完整的庫,而我正在尋找更具體的例子。 – 2010-04-25 11:44:33

+0

TPL是一個完整的庫,但是它是作爲.NET 4的一部分添加的,多線程的應用程序在.NET 4中。看到你的答案和我的相似,我沒有看到這怎麼回答你的問題。 – 2010-04-25 13:19:02

+0

我知道TPL是在.NET4中添加的,我知道這是首選方式。我在tpl內部尋求類和方法。我的答案描述了其中的一些+例子,你只是指出了3,並且根本沒有例子/解釋。 – 2010-04-25 17:19:33

1

嚴格地說,這是C#4.0,而不是一個新的類,但事件now have a smarter form of locking這要是我理解正確的變化,去除需要如下所示(由喬恩斯基特從this article採取的)鎖定碼的reems:

SomeEventHandler someEvent; 
readonly object someEventLock = new object(); 

public event SomeEventHandler SomeEvent 
{ 
    add 
    { 
     lock (someEventLock) 
     { 
      someEvent += value; 
     } 
    } 
    remove 
    { 
     lock (someEventLock) 
     { 
      someEvent -= value; 
     } 
    } 
}