阻止线程而不阻止正常控件

时间:2013-10-28 20:16:14

标签: c# .net multithreading

我正在制作一个简单的GUI程序,它将为您提供符合用户提供的搜索条件的特定文件列表。
有时搜索需要花费很多时间(10-15s)。所以我在一个新线程中调用了搜索功能。同样在函数中,有一些代码,只能在新创建的线程中止后运行。因此,我使用Join()函数来阻止程序的执行,直到线程完成。但是使用它会导致应用程序挂起。我可以解决这个问题。

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:3)

您的UI挂起,因为UI线程正在等待新线程完成 - 实际上,您遇到的问题就像直接在UI线程上运行搜索一样。

解决方案:不要等待新线程。为了在完成线程后对UI做一些事情,可以使用Control.Invoke从该线程回调到UI代码。例如,如果您的表单被称为m_myForm,您可以在后台线程上执行此操作以在UI线程上调用表单上的函数,并传递结果:

m_myForm.Invoke((Action)() => m_myForm.DoSomethingWithSearchResult(result));

或者,您可以使用BackgroundWorker而不是直接使用Thread。这将帮助您在非UI线程上运行某些东西,并在工作完成时引发事件,并负责在UI和后台工作之间正确同步。