我有一个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