2010-04-30 28 views
10

之間有什麼區別:啓動一個新的線程 差異,使併發程序

  • 使用TPL
  • 使用的BackgroundWorker
  • 所有這些創造併發

    1. 但這些之間的低級差異是什麼?無論如何,所有3個線程都做了嗎?

      感謝

    回答

    19

    它們都使用線程內部,分歧與每個API的抽象級別以及如何利用線程做。讓我們重新排序列表了一下,看看從最低的三項技術,以抽象的最高水平:

    1. 手動開始一個新的線程:

      這實際上會在操作系統一個新的線程。您的代碼將在該線程上執行。

    2. 使用一個BackgroundWorker

      在內部使用這個東西叫做.NET ThreadPool。線程池基本上是一個可用線程池。您的代碼被分配到其中一個可用線程並在該線程上運行。

      池管理可用線程的數量,並將在特定範圍內根據需要內部創建和銷燬線程。這很有用,因爲池可以有一些算法來優化線程創建。線程創建是一個相當昂貴的過程,所以如果合適的話,線程池可以讓線程保持活動狀態並將其用於未來的請求。通過指定線程的最小/最大數量和一些小的調整,你可以對池進行一些有限的控制。

      還有其他直接使用ThreadPool的方法,如QueueUserWorkItem(...)

    3. 使用任務並行庫

      這是一個更高的抽象。你創建「任務」並告訴TPL執行它們。 TPL隱藏了關於確切地有多少線程以及將使用哪些優先級的所有問題.TPL能夠根據特定的機器性能和可用的CPU資源重用線程並對其進行管理。例如,如果給定100個任務,在四核上,TPL可能會產生4個線程,但在8核心上,它可能產生8個任務,並在任務完成時將任務分配到可用線程上。

    所以要回答你的問題。所有3種技術都使用線程,但隨着每個級別上升,您對這些線程的控制和意識的數量會減少。

    在大多數情況下,我會建議您使用TPL。除非您需要對線程數量及其創建/銷燬的特定非常精確的控制,否則TPL將爲您處理這一切。

    3
    1. 啓動新線程是最昂貴的三個,但你的大多數可能。就像設置公寓模式和優先級一樣。

    2. 任務並行庫將在ThreadPool上運行一個任務(除非任務被標記爲需要它自己的線程)並添加異常處理和等待完成功能。

    3. BackgroundWorker僅用於運行從WinForms或WPF生成的任務。它還使用線程池

    4. 附加:線程池。用於運行較短的任務,而不需要創建單獨的線程的開銷。

    +1

    「ThreadPool」的+1 – Cornelius 2010-04-30 11:55:35

    2

    創建一個線程就是這樣......你產生一個線程併發地運行到你的主進程線程。

    在TPL中,如果您創建了一個任務,它將使用線程池來查找一個空閒線程來運行任務。當你創建大量的任務時,這可以更有效率,因爲TPL能夠平衡任意數量的空閒線程的負載(大概根據你擁有的內核數量來平衡線程數量,但我不知道這是肯定的。 )

    最後,BackgroundWorker在單獨的線程上運行您的工作。這實際上只是一個很好的抽象,它可以將您從線程的凌亂部分中移除,因爲它是爲您管理的。如果我沒有弄錯,它還提供了一種發送狀態更新的方法。 (不知道這是否使用Windows線程池,但我也不會感到驚訝)

    最後,你要選擇什麼是適合你的程序,但TPL任務的目的是爲了讓你有效安排可以並行運行的任務,而創建線程或使用後臺工作人員可能更適合長時間運行的操作,或者您希望後臺線程永遠活着等待某些信號的場景(通過我實際上建議使用RegisteredWait,只是等待一些事件發出信號。)