Thread.Join()是在线程函数工作时让主线程更新GUI的好方法

时间:2017-01-18 13:36:58

标签: c# multithreading

我有Main()功能,在标签中显示当前时间。有一个按钮调用函数LoadUserImage()来读取图像文件并将它们写入数据库,然后在另一个标签中显示读取和写入的结果。当LoadUserImage()正在运行时,我希望Main()功能仍然在标签中显示当前时间。我的导师告诉我将LoadUserImage()放在一个单独的线程中然后加入它。但是在他的讲座中,他告诉Thread.Join()使主线程暂时暂停问题是:如果加入使主线程暂停,那么在我的情况下如何更新GUI呢?

1 个答案:

答案 0 :(得分:1)

Thread.Join()的目的是确保先前启动的后台线程正确停止,但后台线程不需要它。

在您的情况下,您在后台线程中启动长时间运行的操作,并在主线程中继续执行其他活动。只有在主线程已经完成其活动时才需要调用Thread.Join()。如果此时后台线程已经终止,Thread.Join()将立即返回,而如果后台线程仍然忙,它将阻塞(在主线程中)直到后台线程完成。这是确保应用程序在后台运行处于活动状态之前不会退出的方法。

我想在你的Main()(在主线程中运行)你有一些循环定期更新一些UI。此循环具有一些退出条件(例如,通过在Console.ReadLine()或Ctrl-C处理程序中按Enter键作出反应)。退出循环后,它可以调用Thread.Join()。

如果你的示例程序中没有实现正确的退出(这不是很好,但通常在这样的示例程序中),那么你根本不需要调用Thread.Join()!当进程退出时,所有线程都会消失。