我正在制作一个简单的 GUI 程序,它将为您提供与用户提供的搜索条件匹配的特定文件列表。
有时搜索需要很长时间(10-15 秒)。所以我在一个新线程中调用了 Search 函数。同样在函数中,有一些代码,只能在新创建的线程中止后运行。因此,我使用 Join() 函数来阻止程序的执行,直到线程完成。但是使用它会导致应用程序挂起。我能有一个解决这个问题的方法吗?
问问题
75 次
2 回答
4
于 2013-10-28T20:25:54.813 回答
3
您的 UI 挂起是因为 UI 线程正在等待新线程完成 - 本质上,您遇到的问题与直接在 UI 线程上运行搜索相同。
解决方案:不要等待新线程。为了在线程完成后对 UI 执行某些操作,您可以使用 Control.Invoke 从该线程回调 UI 代码。例如,如果您的表单被调用m_myForm
,您可以在后台线程上执行此操作,以在 UI 线程上调用表单上的函数,并传递结果:
m_myForm.Invoke((Action)() => m_myForm.DoSomethingWithSearchResult(result));
或者,您可以使用BackgroundWorker而不是直接使用 Thread。这将帮助您在非 UI 线程上运行某些东西,并在工作完成时引发事件,并负责在 UI 和后台工作之间正确同步。
于 2013-10-28T20:26:51.283 回答