繁体   English   中英

多线程搜索框

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM