我有一个自定义搜索框控件(以非常自定义的方式访问我的数据库)。搜索方法可能需要超过 3 秒才能完成,这会导致严重的滞后。为了解决这个问题,我开始在不同的线程上运行搜索方法。每次更改文本框中的文本时,都会创建一个新线程来运行搜索并填充数据网格,并且由于人们键入的速度比搜索运行的速度快,因此我最终会同时运行大约 10 个搜索线程。
问题是,如果第一次搜索花费的时间比第二次长,则第二次(最新)搜索会填充数据网格,然后是第一次(非当前)搜索,因为它需要更长的时间才能完成。这意味着搜索数据不再与搜索字段中的内容匹配。
我需要一种方法来“取消”除最新线程之外的所有线程。
我已经尝试过这段代码来取消最近的搜索,但没有运气。
System.Threading.Thread searchThread;
public void RunSearch()
{
if (searchThread != null)
{
if (searchThread.IsAlive)
{
searchThread.Abort();
}
}
searchThread = new System.Threading.Thread(new System.Threading.ThreadStart(RunSearchThread));
searchThread.Start();
}
该RunSearch()
方法是在 TextChanged 事件上调用的方法。
该RunSearchThread()
方法执行搜索。它还捕获 ThreadAbortException 并结束该方法。
这样做仍然会导致搜索出现奇怪的滞后。我假设这是因为它正在等待线程中止,然后主线程才能继续。
有没有更好的方法来“取消”除最新线程之外的所有线程?如果没有,有没有更好的方法来做一个搜索框?