2010-04-19 106 views
2

我們有一個商業案例,將完美的多個BackgroundWorkers。產卵BackgroundWorkers

作爲一個例子,我們有一個帶有「保存」按鈕的窗體。通常我們會同步運行所有的保存命令(Save是一個例子),然後關閉表單。我們現在想要使用backgroundworker將工作分解到單獨的線程。

我們將遍歷每個需要執行的「保存」(可能需要執行多個和/或不同數量的命令),以便爲每個需要的命令創建一個BackgroundWorker。

問題是......我們如何等待所有BackgroundWorkers完成之後才能關閉表單。我們知道如何等待單個BackgroundWorker完成,但是當我們有多少個BackgroundWorkers在運行時,我們如何等到所有完成才能關閉UI表單?

回答

2

跟蹤你已經開始,遞減的Completed事件的數量,並關閉該窗體,當它到達0

由於Completed事件在UI線程上提出BackgroundWorkers的數量,你不」不必擔心線程安全。

+0

這是一個好主意! – washtik 2010-04-19 00:41:12

0

我建議使用下面的(非常優異)MSDN雜誌文章中介紹的CountdownLatch類:記住SLaks

9 Reusable Parallel Data Structures and Algorithms

軸承注意有關BackgroundWorker的UI線程上被提出Completed事件,此可能會矯枉過正。

+0

你不需要。 BackgroundWorker在UI線程上觸發其「Completed」事件,因此線程安全不是問題。 – SLaks 2010-04-19 00:34:27

+0

以前從未使用BackgroundWorker,所以今天我學到了一些東西。這是否意味着它們只能用於Forms應用程序? – spender 2010-04-19 00:36:24

+0

否;它使用'SynchronizationContext'。 – SLaks 2010-04-19 00:49:51