2011-03-18 24 views
4

我正在重溫an old thread of mine線程應該如何更新主程序中的全局數據?

我想啓動一堆線程,每個線程執行相同的任務,並且在main()中每次完成時都知道它,如果它成功或失敗了。

提供的解決方案是使用ConcurrentQueue,但其他帖子建議使用BackgroundWorker Class或線程池。

是否有確定的答案?

再次,所有線程執行相同的代碼,並有合格/不合格的結果。我想跑的比可用的線程多,所以一旦線程完成,我將啓動另一個儘快 - 我希望tehm儘可能強調遠程系統(比使用太多線程來強調我的本地PC更重要),所以我會需要嘗試確定最佳線程數)。

VB .NET的具體答案,但一般的線程建議也是受歡迎的。

回答

5

BackgroundWorker是一種管理正在運行的線程的非常簡單的方法。它允許您輕鬆地將進度報告回UI。我不認爲有一個明確的答案,但BackgroundWorker是專爲此目的而設計的 - 運行後臺任務,隨着他們的進展更新UI。這裏是an example of how to is it

+0

你知道如果類是從線程類琢磨? – Mawg 2011-03-22 03:22:02

+0

我添加了更多信息的鏈接,但是,在幕後,它正在啓動一個線程來完成這項工作。 – 2011-03-22 13:48:48

+0

+1謝謝,喬希,尤其是這個例子。 – Mawg 2011-03-22 22:52:31

1

Josh's就是我要走的路。

根據需要創建儘可能多的新背景工作者,掛鉤以攔截他們的「完成」事件(我忘記了確切的名稱),並且當這些事件在主應用程序線程上回擊時,將結果存儲在集合/列表中/ somesort數組。

如果您真的需要共享線程,那麼您不會創建大量可能導致大量上下文抖動的線程,這些事情會變得非常有趣。相反,您希望擁有一個2x的池(機器中的處理器數量),並且當每個背景工作者完成時,排隊完成另一個任務。

1

這取決於。在Windows Forms應用程序中,我將使用BackgroundWorker,因爲它非常易於安裝和使用,並且可以節省很多頭痛,從而找到不正確的跨線程錯誤。

但是,您必須知道BackgroundWorker只有在有UI線程和消息循環的環境中才能正常工作。所以它不會在控制檯應用程序中工作,例如。

在這種情況下,您應該使用其他解決方案ThreadThreadPool或某種框架。

+0

+1謝謝。性能是至關重要的,所以我需要一個快速的解決方案,即使犧牲一個簡單的解決方案。你知道類的層次嗎? backgroundworker是從線程派生的嗎? – Mawg 2011-03-22 22:51:32

1

我同意關於BackgroundWorker的主張。但是,如果您需要從後臺線程訪問COM對象,請不要使用BackgroundWorker,而應創建自己的線程機制,並根據需要使用MTA STA模型。

相關問題