【问题标题】:How do you notify a parent thread that all child threads have terminated?如何通知父线程所有子线程都已终止?
【发布时间】:2011-02-27 19:52:52
【问题描述】:

我有一个要移植到 WPF 的控制台应用程序。该应用程序有 3 个工作线程,在将一些输出结果打印到屏幕之前,它们都连接到主线程。我的理解是,如果我尝试在 WPF 应用程序中做同样的事情,GUI 将被阻止并且不会响应用户。那么如何通知父线程所有线程都已完成工作?我认为解决方案将涉及委托和事件(或者可能是 BackgroundWorker?),但我不清楚当线程终止时如何调用回调。

原代码:

foreach (Thread t in threadList)
{
                t.Start();
}

foreach (Thread t in threadList)
{
                t.Join();
}

// print some results here

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    如果您使用三个BackgroundWorkers,您可以使用事件RunWorkerCompleted 来通知其中一个工人已完成:在启动工人之前,将计数器设置为 3,然后递减并在名为的方法中检查此计数器RunWorkerCompleted 如果它达到 0,你就完成了。

    【讨论】:

      【解决方案2】:

      您应该使用三个 BackgroundWorker。

      然后,您可以处理他们的RunWorkerCompleted 事件以了解操作何时完成。

      【讨论】:

        【解决方案3】:

        查看 MSDN 杂志中的 article,它为您提供了使用 BackgroundWorker 的示例。从图 7 开始。

        【讨论】:

          【解决方案4】:

          取决于你想完成什么。你想促进什么形式的交流?

          如果我猜的话,您真正想要的只是在您的应用程序中报告[或显示]您的工作人员结果。如果是这种情况,那么在典型的 WPF 应用程序中,您有一个视图模型,比如说

          public class AwesomeViewModel : INotifyPropertyChanged
          {
              // if small fixed number, otherwise, you could use 
              // an ObservableCollection<T> 
              public string WorkerResultA { ... }
              public string WorkerResultB { ... }
              public string WorkerResultC { ... }
          }
          

          数据绑定到您的 WPF 控件。您可以简单地将视图模型的引用传递给每个工作线程,它们会更新类,而无需在 Gui 线程上阻塞\等待。以这种方式,每个工人在完成时报告其结果,而无需任何其他人的干预。这是最佳选择。

          当然,如果您继续这样做,you run into another completely different issue。仅供参考,可以通过 Dispatcher 解决。 One possible solution here.

          至于BackgroundWorker 与显式Thread 控制,这取决于您。两者都有优点,但请记住您已经编写了功能代码。那,在我个人看来,BackgroundWorker 并不是特别有用。

          如果你非常肯定必须实现更复杂的同步模型,那么我强烈建议你复习ManualResetEvent它的表亲AutoResetEventSemaphore、关键字lock和并发编程一般。对不起,那里没有捷径:)

          希望这会有所帮助!

          【讨论】:

            【解决方案5】:

            如果你只想轮询工作线程,你可以使用类似的东西 bool threadWasDone = thread.Join(0);

            【讨论】:

              猜你喜欢
              • 2014-03-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-06-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多