[英]Multithreaded Searchbox
我有一个自定义搜索框控件(该控件以非常自定义的方式访问我的数据库)。 搜索方法可能需要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}" ... />
ViewModel:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.