我有一個UI按鈕,產生一個BackgroundWorker。這個BackgroundWorker產生了幾個執行一些操作的BackgroundWorkers。有沒有辦法等待主BackgroundWorker中的所有內部BackgroundWorkers完成?等待嵌套的BackgroundWorkers完成
0
A
回答
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
5
您可以創建Semaphore,把它傳遞給催生背景的工人,然後在後臺工作的代碼調用Release方法的結束。在主要工人電話WaitOne確切的時間等於產生的工人數量。確保在try ... finally
中包含所有內容,以便在出現問題時應用程序不會掛起。
如果您使用.net 4考慮使用SemaphoreSlim,它是具有相同功能的輕量級版本。
這實際上不是很好的解決方案,因爲它會燒壞CPU而不做任何有用的事情。如果您將「Thread.Sleep」添加到循環體中,它會有所幫助,但當工作人員完成時,它仍不會立即退出。 – Andrey 2012-08-07 16:26:53
@Andrey - 同意Thread.Sleep - 我會添加這個,但是我想象一下,真實世界對CPU的影響可以忽略不計。 – 2012-08-07 16:31:08
此解決方案可以工作,但在需要立即通知異步操作結束的情況下,它將無法很好地工作。 – Andrey 2012-08-07 16:33:17