【问题标题】:Multiple background worker in chain链中的多个后台工作者
【发布时间】:2012-08-10 20:54:30
【问题描述】:

我有 3 个耗时的函数序列,我想在后台工作者或其他任何工具中执行它们,我的问题是每个函数都应该等待先例函数完成,所以这是我的伪代码:

open_session() // during the execution of this function i like to display a loading-window 

open_session() //this function opens a process another windows app , while opening this app i would like to keep the current app responsive.

close_session()// during the execution of this function i like to display a loading-window 

我想用后台工作人员来做这件事,但做功能是异步的。

请帮忙

【问题讨论】:

    标签: c# .net multithreading backgroundworker


    【解决方案1】:

    为什么不在同一个后台工作人员中按顺序执行所有三个?因此,您的后台工作人员工作事件将如下所示:

    private void yourBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        open_session();
        open_session();
        close_session();
    }
    

    这样,backgroundworker本身是async的,但是你想顺序运行的三个方法,仍然是在async方法的上下文中顺序运行的。

    【讨论】:

      【解决方案2】:

      只需在前一个的 RunWorkerCompleted 事件处理程序中启动每个连续的工作人员...

      解决反对意见:请注意,这是一种可能性。这是否是一个好的选择,显然取决于上下文,就像往常一样。我不相信“最好只使用一个 BGW”这样的黄金法则。我可以想象很多情况,在这些情况下,对所有任务使用单个 BW 不会简化问题(例如,如果每个操作都需要以不同方式处理 ProgressChanged)。

      OP 询问了多个后台工作人员,没有给出足够的背景来判断哪种方法最好 - 据我所知,他可能只是理论上想知道如何“链接”BW,以便更好地理解BW 是如何工作的。

      【讨论】:

      • 如果您只是要同步它们,为什么还要费心管理所有这些额外线程/任务的开销。最好一开始只使用一个 BGW。
      • @Servy 它是什么类型的开销,真的吗?它可能会使代码更具可读性,例如,如果使用e.Result,并且在完成每个任务时分配的结果是不同的类型。我已经看到代码将所有异步内容放入一个大的DoWork 事件处理程序中;可能不会通过管理额外线程的开销,但臃肿且更难以调试。
      • 是的,我正在寻找你的解决方案,但我试图避免玩 BGW RunWorkerCompleted 事件,有没有办法避免玩这个事件?
      • 您不想使用RunWorkerCompleted 的任何特殊原因?您可以使用其他线程构造,将BackgroundWorker 抛在后面(例如ManualResetEvent.WaitOne),但这可能有点矫枉过正,而且如果不知道您想要实现的目标是什么以及影响您的选择的因素,很难给您建议.
      猜你喜欢
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多