【发布时间】:2012-08-07 16:18:00
【问题描述】:
我有一个生成 BackgroundWorker 的 UI 按钮。这个 BackgroundWorker 产生了几个执行某些操作的 BackgroundWorker。有没有办法在主 BackgroundWorker 中等待所有内部 BackgroundWorkers 完成?
【问题讨论】:
标签: c# .net wpf vb.net backgroundworker
我有一个生成 BackgroundWorker 的 UI 按钮。这个 BackgroundWorker 产生了几个执行某些操作的 BackgroundWorker。有没有办法在主 BackgroundWorker 中等待所有内部 BackgroundWorkers 完成?
【问题讨论】:
标签: c# .net wpf vb.net backgroundworker
您可以创建Semaphore,将其传递给生成的后台工作人员,然后在后台工作人员代码的末尾调用Release 方法。在主要工作人员调用WaitOne 中,确切的次数等于产生的工作人员的数量。确保将所有内容都包含在 try ... finally 中,这样如果出现问题,您的应用程序就不会挂起。
如果您使用.net 4,请考虑使用SemaphoreSlim,它是具有相同功能的轻量级版本。
【讨论】:
在您的主要工作人员代码中,您可以检查其他工作人员的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
【讨论】:
Thread.Sleep 添加到循环体中,它会有所帮助,但它仍然不会在工人完成后立即退出。