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

本文关键字:控件 线程 常控件 | 更新日期: 2023-09-27 18:37:22

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

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

您需要后台辅助角色控件

看这里:

http://www.dotnetperls.com/backgroundworker

http://msdn.microsoft.com/en-us/vstudio/bb798034.aspx

您的 UI

挂起是因为 UI 线程正在等待新线程完成 - 本质上,您遇到了与直接在 UI 线程上运行搜索相同的问题。

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

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

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