0

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

这样做仍然会导致搜索出现奇怪的滞后。我假设这是因为它正在等待线程中止,然后主线程才能继续。

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

4

1 回答 1

0

而不是运行 on 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;
}
于 2013-09-21T17:26:42.007 回答