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

时间:2010-06-04 14:11:59

标签: c# multithreading

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

原始代码:

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

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

// print some results here

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

您应该使用三个BackgroundWorkers。

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

答案 2 :(得分:1)

在MSDN杂志中查看此article,其中提供了使用BackgroundWorker的示例。从图7开始。

答案 3 :(得分:1)

取决于您想要完成的任务。您想要促进哪种形式的沟通?

如果我猜测,你真正想要的只是简单地报告[或显示]你的工作人员在你的申请中的结果。如果是这种情况,那么在典型的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。其中,fyi,可通过Dispatcher解析。 One possible solution here

至于BackgroundWorker与明确的Thread控件,这取决于您。两者都有优点,但请记住,您已经编写了功能代码。那个,我个人认为,BackgroundWorker并不是特别有用。

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

希望这有帮助!

答案 4 :(得分:0)

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

相关问题