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

C# 如何通知父线程所有子线程都已终止?,c#,multithreading,C#,Multithreading,我有一个正在移植到WPF的控制台应用程序。应用程序有3个工作线程,在将一些输出结果打印到屏幕之前,这些线程都连接到主线程。我的理解是,如果我尝试在WPF应用程序中执行相同的操作,GUI将被阻止,并且不会响应用户。那么,如何通知父线程所有线程都已完成其工作?我认为解决方案将涉及委托和事件(或者BackgroundWorker?),但我不清楚如何在线程终止时调用回调 原始代码: foreach (Thread t in threadList) { t.Start();

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

原始代码:

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

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

// print some results here

看看MSDN杂志中的这个,它提供了一个使用BackgroundWorker的示例。从图7开始。

您应该使用三个BackgroundWorker


然后,您可以处理它们的事件,以确定操作何时完成。

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

如果您只想轮询辅助线程,你可以用像这样的东西
boolthreadwasdone=thread.Join(0)

取决于您想要完成的任务。你想促进什么形式的交流

如果让我猜猜,您真正想要的是在应用程序中简单地报告[或显示]您的工作人员结果。如果是这种情况,那么在一个典型的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 { ... }
}
公共类AwesomeViewModel:INotifyPropertyChanged
{
//如果固定数量小,否则,可以使用
//可观察到的收集
公共字符串WorkerResultA{…}
公共字符串WorkerResultB{…}
公共字符串WorkerResultC{…}
}
这是绑定到WPF控件的数据。您只需将视图模型的引用传递给每个工作线程,它们就可以更新类,而无需阻塞\等待Gui线程。通过这种方式,每个工作人员在完成时报告其结果,而不需要任何其他人的干预。这是最优的

当然,如果你继续这样做。仅供参考,可通过调度员解决

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

如果您确实绝对必须实现一个更复杂的同步模型,那么我强烈建议您学习一下它的近亲、关键字和并发编程。对不起,没有快捷方式:)

希望这有帮助