多线程搜索框

时间:2013-09-21 16:45:51

标签: c# wpf multithreading

我有一个自定义搜索框控件(以非常自定义的方式访问我的数据库)。搜索方法可能需要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并结束方法。

这样做仍会导致搜索中出现奇怪的滞后。我假设这是因为它在主线程可以继续之前等待线程中止。

有没有更好的方法来“取消”除最近的线程之外的所有内容?如果没有,有没有更好的方法来做搜索框?

1 个答案:

答案 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;
}