2014-04-21 78 views
0

那是好,如果讓我們說我有多個BackgroundWorkers可以使用相同的函數/結束變量嗎?

BackgroundWoker1 
BackgroundWoker2 

他們兩人都具有:

AddHandler BackgroundWoker1.DoWork, AddressOf requestDataTravelPackagesName 
AddHandler BackgroundWoker1.ProgressChanged, AddressOf showLoadingAnim 

,並在其他線路(具有不同的時間使用)

AddHandler BackgroundWoker2.DoWork, AddressOf requestDataTravelPackagesName 
AddHandler BackgroundWoker2.ProgressChanged, AddressOf showLoadingAnim 

這是允許?因爲我嘗試過類似的事情,而且看起來我的表格出現故障。 但它不給我任何錯誤/消息。框架(GUI)剛剛消失。

我在想也許這是因爲我有多個後臺工作人員。可能他們正在訪問相同的變量(在完成的功能)或類似的功能/等等。

+0

其實我會建議避免BackgroundWorkers,因爲有更好的選擇,如任務,線程,ThreadPools等 –

+1

@Trade,我不能不同意更多。根本沒有理由避免BackgroundWorkers。我可以看到你可能會建議使用Task來代替,但是建議在適當使用BackgroundWorker的情況下使用Thread或ThreadPool類,即在窗體或窗口中執行後臺任務,這只是一個不好的建議。 – jmcilhinney

+0

嗯,img BackgroundWorker並不是一個很好的解決方案。我沒有取得好的經驗。另外我也會錯過那裏的異常處理,因爲它會吞噬異常並進入RunWorkerCompleted事件等。這有點令人困惑。優點是你可以直接向UI報告進度,但總的來說,我更喜歡任務,它只是更現代化,並帶來很多不錯的功能。 –

回答

1

原則上建議你絕對沒有問題。如果存在問題,那麼這與您的實施有關。

DoWork事件處理程序只是一個在輔助線程上執行的方法。在同一時間在多個線程上執行相同的方法是非常常見的,並且這沒有問題。 ProgressChanged事件處理程序在UI線程上執行,因此無論如何您永遠不會有多個實例在執行。

與所有多線程場景一樣,您始終需要確保同步對常用數據的訪問。所有可能出現的單線程代碼問題都必須考慮到,以及可能的跨線程訪問控制以避免。

要知道您的具體情況是什麼問題,我們需要確切地知道您的具體情況會發生什麼。

+0

不是一個有用的評論,但不能同意你更多。布拉沃。 –

相關問題