2012-08-07 78 views
0

我有一個UI按鈕,產生一個BackgroundWorker。這個BackgroundWorker產生了幾個執行一些操作的BackgroundWorkers。有沒有辦法等待主BackgroundWorker中的所有內部BackgroundWorkers完成?等待嵌套的BackgroundWorkers完成

回答

0

在你的主要工作人員的代碼,你可以檢查其他工人

IsBusy Property「獲取指示的BackgroundWorker是否正在運行的異步操作的值。」

Private Sub BackgroundWorkerMaster_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorkerMaster.DoWork 
    Do While bgwChild1.IsBusy AndAlso bgwChild2.IsBusy 
     System.Threading.Thread.Sleep(1) 'wait for a small amount of time 
    Loop 
End Sub 
+0

這實際上不是很好的解決方案,因爲它會燒壞CPU而不做任何有用的事情。如果您將「Thread.Sleep」添加到循環體中,它會有所幫助,但當工作人員完成時,它仍不會立即退出。 – Andrey 2012-08-07 16:26:53

+0

@Andrey - 同意Thread.Sleep - 我會添加這個,但是我想象一下,真實世界對CPU的影響可以忽略不計。 – 2012-08-07 16:31:08

+0

此解決方案可以工作,但在需要立即通知異步操作結束的情況下,它將無法很好地工作。 – Andrey 2012-08-07 16:33:17

5

您可以創建Semaphore,把它傳遞給催生背景的工人,然後在後臺工作的代碼調用Release方法的結束。在主要工人電話WaitOne確切的時間等於產生的工人數量。確保在try ... finally中包含所有內容,以便在出現問題時應用程序不會掛起。

如果您使用.net 4考慮使用SemaphoreSlim,它是具有相同功能的輕量級版本。

+0

我不會在後臺工作者代碼(在DoWork中)的末尾發佈,因爲裏面的代碼可能會崩潰,永遠無法到達DoWork的末尾。我將它放在RunWorkerCompleted中,以便始終調用它。 – svenv 2014-02-05 08:32:33

+1

@svenv這就是爲什麼我提到包裝它試圖最終阻止。 – Andrey 2014-02-05 09:09:29

+1

你當然是對的,然後在最後打電話給Release ... – svenv 2014-02-05 13:12:24