我有一个自定义搜索框控件(以非常自定义的方式访问我的数据库)。搜索方法可能需要3秒才能完成,这会导致可怕的滞后。为了解决这个问题,我开始在不同的线程上运行搜索方法。每次在文本框中更改文本时,都会创建一个运行搜索并填充数据网格的新线程,并且因为人们输入的速度比搜索运行的速度快,所以我最终会同时运行大约10个搜索线程。 / p>
问题是如果第一次搜索花费的时间长于第二次,则第二次(最新)搜索会填充数据网格,然后是第一次(非当前)搜索,因为它需要更长时间才能完成。这意味着搜索数据不再与搜索字段中的搜索数据匹配。
我需要一种方法来“取消”除最近一个之外的所有线程。
我已尝试使用此代码取消之前的搜索,但没有运气。
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并结束方法。
这样做仍会导致搜索中出现奇怪的滞后。我假设这是因为它在主线程可以继续之前等待线程中止。
有没有更好的方法来“取消”除最近的线程之外的所有内容?如果没有,有没有更好的方法来做搜索框?
答案 0 :(得分:0)
不是在TextChanged
上运行,而是在viewmodel中对属性进行延迟绑定。然后,您的搜索将仅在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;
}