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