代码之家  ›  专栏  ›  技术社区  ›  Andrew

如何通知父线程所有子线程都已终止?

  •  7
  • Andrew  · 技术社区  · 15 年前

    我有一个控制台应用程序要移植到WPF。该应用程序有3个工作线程,在一些输出结果打印到屏幕之前,这些线程都连接到主线程。我的理解是,如果我尝试在WPF应用程序中执行相同的操作,那么GUI将被阻塞,不会对用户产生任何影响。那么,如何通知父线程所有线程都已完成其工作?我认为解决方案将涉及代表和活动(或者可能是背景工作者?)但我不清楚如何在线程终止时调用回调。

    原代码:

    foreach (Thread t in threadList)
    {
                    t.Start();
    }
    
    foreach (Thread t in threadList)
    {
                    t.Join();
    }
    
    // print some results here
    
    5 回复  |  直到 15 年前
        1
  •  6
  •   Hinek    15 年前

    如果你用三个 BackgroundWorker S,您可以使用活动 RunWorkerCompleted 要注意其中一个工人已完成:在启动工人之前,将计数器设置为3,然后在由调用的方法中递减并检查此计数器。 运行工作已完成 如果点击0,你就完成了。

        2
  •  3
  •   SLaks    15 年前

    你应该用三个背景工作者。

    你可以处理他们的 RunWorkerCompleted 用于确定操作何时完成的事件。

        3
  •  1
  •   Zamboni    15 年前

    看看这个 article 在提供了使用BackgroundWorker的示例的msdn杂志中。从图7开始。

        4
  •  1
  •   Community CDub    8 年前

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

    如果我猜的话,你真正想要的是简单地在你的应用程序中报告(或显示)你的工作人员的结果。如果是这样,那么在典型的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 . 仅供参考,可通过调度程序解决。 One possible solution here .

    至于 BackgroundWorker 相对于显式 Thread 控制权,由你决定。这两者都有好处,但请记住,您已经编写了函数代码。我个人认为, 背景工作者 不是特别有用。

    如果你 真的非常积极 必须实现更复杂的同步模型,然后我强烈建议您 ManualResetEvent 它的表妹 AutoResetEvent , Semaphore 关键词 lock 以及一般的并发编程。抱歉,没有捷径:)

    希望这有帮助!

        5
  •  0
  •   LaustN    15 年前

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