多线程搜索框
本文关键字:搜索 多线程 | 更新日期: 2023-09-27 18:32:19
我有一个自定义搜索框控件(以非常自定义的方式访问我的数据库)。 搜索方法可能需要 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 并结束该方法。
这样做仍然会导致搜索出现奇怪的滞后。 我假设这是因为它正在等待线程中止,然后主线程才能继续。
有没有更好的方法来"取消"除最新线程之外的所有线程?如果没有,有没有更好的方法来做搜索框?
不是在 TextChanged
上运行,而是对视图模型中的属性进行延迟绑定。然后,您的搜索将仅在 x 毫秒不活动后运行。
视图:
<TextBox Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged, Delay=1000" />
<Datagrid ItemsSource="{Binding SearchResults}" ... />
视图模型:
private string _searchText
public string SearchText
{
get{...}
set
{
if(_searchText != value)
{
_searchText = value;
RunSearch();
}
}
public ObservableCollection<...> SearchResults { get; set; }
private void searchThreadCompleted(results)
{
SearchResults = results;
}