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

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

原始代码:

foreach (Thread t in threadList) { t.Start(); } foreach (Thread t in threadList) { t.Join(); } // print some results here 

如果您使用的是三个BackgroundWorker ,则可以使用事件RunWorkerCompleted注意其中一个工作程序已完成:在启动工作程序之前将计数器设置为3然后在RunWorkerCompleted调用的方法中递减并检查此计数器(如果它达到0)完了。

您应该使用三个BackgroundWorkers。

然后,您可以处理其RunWorkerCompleted事件以查明操作何时完成。

看一下MSDN杂志中的这篇文章 ,它给出了一个使用BackgroundWorker的例子。 从图7开始。

取决于你想要完成的事情。 您想要促进哪种forms的沟通?

如果我猜,你真正想要的只是简单地报告[或显示]你的工作人员在你的申请中的结果。 如果是这种情况,那么在典型的WPF应用程序中,您就拥有了一个视图模型

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

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

当然,如果你继续这样做, 你会遇到另一个完全不同的问题 。 其中,fyi,可通过Dispatcher解析。 一个可能的解决方案 。

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

如果你真的绝对肯定必须实现更复杂的同步模型,那么我强烈建议你刷一下ManualResetEvent它的表兄AutoResetEvent , Semaphore ,关键字锁和一般的并发编程。 对不起,没有快捷方式:)

希望这可以帮助!

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