【问题标题】:Waiting for nested BackgroundWorkers to complete等待嵌套的 BackgroundWorkers 完成
【发布时间】:2012-08-07 16:18:00
【问题描述】:

我有一个生成 BackgroundWorker 的 UI 按钮。这个 BackgroundWorker 产生了几个执行某些操作的 BackgroundWorker。有没有办法在主 BackgroundWorker 中等待所有内部 BackgroundWorkers 完成?

【问题讨论】:

    标签: c# .net wpf vb.net backgroundworker


    【解决方案1】:

    您可以创建Semaphore,将其传递给生成的后台工作人员,然后在后台工作人员代码的末尾调用Release 方法。在主要工作人员调用WaitOne 中,确切的次数等于产生的工作人员的数量。确保将所有内容都包含在 try ... finally 中,这样如果出现问题,您的应用程序就不会挂起。

    如果您使用.net 4,请考虑使用SemaphoreSlim,它是具有相同功能的轻量级版本。

    【讨论】:

    • 我不会在后台工作代码(在 DoWork 中)的末尾发布,因为里面的代码可能会崩溃并且永远不会到达 DoWork 的末尾。我会把它放在 RunWorkerCompleted 中以便它总是被调用。
    • @svenv 这就是为什么我提到将它包装到 try finally 块中。
    【解决方案2】:

    在您的主要工作人员代码中,您可以检查其他工作人员的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
    

    【讨论】:

    • 这实际上不是一个很好的解决方案,因为它会烧毁CPU而不做任何有用的事情。如果你将Thread.Sleep 添加到循环体中,它会有所帮助,但它仍然不会在工人完成后立即退出。
    • @Andrey - 同意 Thread.Sleep - 我会添加这个,但我想现实世界对 CPU 的影响可以忽略不计。
    • 这个解决方案可以工作,但如果需要立即通知异步操作结束,它就不能很好地工作。
    • 不行,如果不使用Thread.Sleep影响会很大,可以试试。
    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2019-03-15
    相关资源
    最近更新 更多