2012-08-07 75 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