2014-10-16 27 views
0

我發現我很享受通過BackgroundWorkers異步運行代碼的簡單性。我通過例子或反覆試驗來了解自己的用途,陷阱,安全線程等,而不是理論,也許是我的致命弱點。如何創建一個後臺工作者池?

我已經完成了我的研究,但有一件事我沒有找到太多的話題,我如何有效地創建和使用一個BackgroundWorkers池?或者什麼是更好的選擇,就像使用BW一樣簡單?

我會說明我遇到的問題: 我有一個任務X,Y和Z,每一個都是密集的,因此它將掛起UI線程。我決定BW是答案,即使這個代碼只執行一次。我學會了如何使用它們,以及一些安全的線程實踐,並繼續前進。很快我的代碼看起來像:BW1,BW2,BW3等等。

然後我開始更加熟悉它們,並真正將代碼放入可用於硬件監視或其他無限循環/總是運行項目的BW中。我仍遇到BW5,BW6 ....問題。

我發現創造性的方式來通過在調用RunWorkerAsynchronous()之前設置一個全局字符串變量來獲得多用途BackgroundWorkers,然後我可以在BackgroundWorker內部嵌套If/Elses或開關以執行所需的代碼關閉了我設置字符串變量的內容。但是,我覺得我只是在自我學習的極限內跳舞。

因此,誰能指導我通過創建線程/ BW中的池的概念,並根據需要在我的程序中使用它們,回收線程,而不是明確地建立每一個,然後有幾十backgroundworkers的特定密集的目的去玩弄?

注:我不是一個很好的程序員,所以我正在尋找簡單的功能示例或解釋。任何和所有的幫助,但熱切歡迎!

+0

你看過Tasks(TPL)和/或正規的ThreadPool嗎? IIRC,如果需要用於更新WPF或Winforms UI的同步上下文,backgroundworker會很好,但它不完全靈活。 – x0n 2014-10-16 15:46:38

+0

你檢查了[ThreadPool Class](http://msdn.microsoft.com/en-us/library/System.Threading.ThreadPool(v = vs.110).aspx?cs-save-lang = 1&cs-lang = csharp#code-snippet-1) – bansi 2014-10-16 15:46:58

+0

這是.NET 2.0還是更高? – 2014-10-16 15:48:03

回答

1

你不需要集中它們。它們在內部使用了ThreadPool,它已經是一個線程池。

Thread/threadpool or backgroundworker

+0

我明白這一點,然而,BackgroundWorker是明確的代碼。有時候一次性放棄永遠不會放棄,其他時間則永遠不放棄。我如何避免宣佈一打BW,當有些時候他們需要重新使用而其他人是「一次性」的? 我的想法告訴我創建一個HastTable /數組/列表的BW ...但我認爲可能有更好的方法。 – HouseCat 2014-10-16 15:49:25

+0

那麼,如果你正在創造幾十個體重...你可能想重新思考你的方法:)使用類似TPL的東西,你會發現一個新的控制世界http://www.codeproject.com/Articles/747594/Understanding -Task-Parallelism-Framework-TPL-使用BW只是爲了節省一天,從來沒有想過要這樣使用。 – vtortola 2014-10-16 15:56:30

+0

TPL是否會成爲答案,還有很多工作要做......呃。 我實際上得到了建議BWs從微軟開發。感謝您的幫助:) – HouseCat 2014-10-16 15:59:24

2

我強烈建議使用任務,實現你想要什麼。這種管理從線程池中選擇的線程,平衡多個內核等線程的所有的辛勤工作

,如果你具備的功能:

public void DoSomething() 
{ 
    //things happen here 
} 

然後你就可以使用啓動任務:

var task = Task.Factory.StartNew(DoSomething); 

var task = new Task(DoSomething); 

你可以閱讀更多的http://msdn.microsoft.com/en-us/library/dd537609(v=vs.110).aspx

+1

+1查看任務。它們非常靈活:可以使用「async/await」;他們支持鏈/繼續和兒童任務;他們有一個高效的調度程序;他們支持取消;他們與'SynchronizationContext'搭配很好;如果你有一個長期運行的任務,你可以通過'TaskCreationOptions.LongRunning'來確保它獲得它自己的線程並且不阻止新任務被調度。如果你正從一個像BackgroundWorker這樣的高級構造中移動,這將比在ThreadPool上簡單地執行作業更自然。 – 2014-10-16 16:08:20

+0

感謝您提供更多的信息,我希望我可以再使用幾個月的代碼,但現在看起來我必須「長大」並使用大男孩編程。 – HouseCat 2014-10-16 16:17:15

相關問題