2012-11-07 96 views
0

對於C#4.0窗口應用程序中的長時間運行任務(異步)。背景工作者vs線程

的選擇是:

  1. BackgroundWorker的(線程池)

  2. 主題

以上兩種被推薦爲長時間運行的任務(在整個應用程序生命週期)。還有其他選擇嗎?在additon,

  • BackgroundWorker的 - 使用線程池線程並與UI更新長時間運行的過程。

  • 主題 - 用戶自定義線程(線程創建開銷等)和長時間運行的過程(可以使用優先級)

    這將是一個最好的選擇

    1. 如果沒有必要UI更新,優先級和線程(僅在應用程序/進程啓動時創建)?

    2. 如果任務數增加了? (線程池飢餓的護理)

任何其他有趣的事情?

+0

副本http://stackoverflow.com/questions/1506838/backgroundworker-vs-background-thread? –

+0

事實總是相同的,但問題不同。 –

回答

1

對於C#4.0窗口應用程序中的長時間運行任務(異步)。

您可能會在LongRunning選項中使用任務(TPL)。 TPL也運行在ThreadPool的頂部,但該選項可以使它保留一個線程。

如果任務數增加了? (線程池飢餓處理)

ThreadPool將嘗試動態適應,並且您可以選擇稍微幫助它。

+0

@ Henk:對於長時間運行的進程,線程(用戶定義)如何? –

+0

可能但只有當您確實需要更改線程屬性(STA,優先級)時才需要。 –

1

BackgroundWorker也使用線程,但僅提取一些線程創建和監視細節。

所以通過使用BackgroundWorker可以避免; - 必須處理細節 - 創建新線程的高成本(+性能)

僅當您需要在別人結束之前運行另一個異步任務時纔會發生ThreadPool飢餓。這裏沒有太多可以做的事,因爲CPU已經在滿負荷運行。

我不會直接使用Thread的。如果你對提供的ThreadPool不滿意,也許你可以嘗試爲自己實現一個(最好不要做,只是開玩笑)。

+0

我不會直接使用Thread的。任何其他原因? –

+0

正如我所說,難以處理,創建成本高,而ThreadPool使用相同的Thread對象。 ThreadPool已經知道有多少線程應該最好地利用CPU。所以你有一個很好的系統可以在那裏使用。何必? –