通过任务C#动态搜索中断,

我正在与Db(通过SQLite.NET PCL ,而不是异步版本)。 在当前时刻我有一些数据(从数据库中获取)列表视图,还我有一个搜索栏/项(其NVM),其中用户可以输入一些值,然后,通过LINQ我要去进行查询和更新SourceItems我的名单。

所以问题出现在性能上,因为我的数据库有100万条记录,而且简单的LINQ查询工作速度非常慢。换句话说,当用户输入的数据太快时,应用程序会有巨大的滞后,有时会出现崩溃
为了解决这个问题,我想到了一些东西(理论上的解决方案):

1)需要在任务中放置方法(我将查询放入数据库中)(解锁我的主UI线程)

2)初始化定时器,然后开启并:

  • 如果1秒过去了 ,那么=>在任务上运行我的方法(查询)(类似于后台线程)
  • 如果1秒未通过 ,则退出匿名方法。
  • 类似的东西(类似)或任何建议。谢谢!

    UPD:
    说实话,我尝试了太多,没有得到好的结果
    顺便说一句,我现在的代码(片段):
    1)我的SearchMethod

    public void QueryToDB(string filter)
            {
                this.BeginRefresh ();
    
                if (string.IsNullOrWhiteSpace (filter))
                {
                    this.ItemsSource = SourceData.Select(x => x.name); // Source data is my default List of items
                }
                else 
                {
                    var t = App.DB_Instance.FilterWords<Words>(filter); //FilterWords it's a method,where i make direct requests to the database 
                    this.ItemsSource = t.Select(x => x.name); 
                }
                this.EndRefresh ();
            }
    

    2)Searchbar.TextChanged(匿名方法)

    searchBar.TextChanged +=async (sender, e) => 
                    {
                        ViewModel.isBusy = true;  //also i got a indicator,to show progress,while query working
                        await Task.Run(()=> //my background,works fine
                        {
                            listview.QueryToDB(searchBar.Text);
                        });
                        ViewModel.isBusy = false; // after method is finished,indicator turn off
    
                    };
    

    主要的问题是如何当用户输入某个值到搜索栏实现该部分(这些情况下的),其中1秒过去了,只有然后我会作出查询来更新我的清单sourceItems(每次,该触发器(定时器)必须再次刷新为零)。

    任何帮助将不胜感激,谢谢!
    PS对不起,我的工程师。 技能!


    一种方法是结合async Task.RunCancellationTokenSource

    CancellationTokenSource cancellationTokenSource;
    
    searchView.TextChanged += async (sender, e) => 
    {
        if (cancellationTokenSource != null) cancellationTokenSource.Cancel();
        cancellationTokenSource = new CancellationTokenSource();
        var cancellationToken = cancellationTokenSource.Token;
    
        var searchBar = (sender as SearchBar);
        if (searchBar != null)
        {
            string searchText = searchBar.Text;
            try
            {
                await Task.Delay(650, cancellationToken);
    
                if (cancellationToken.IsCancellationRequested) return;
    
                var searchResults = await Task.Run(() => 
                {
                    return ViewModel.Search(searchText);
                });
    
                if (cancellationToken.IsCancellationRequested) return;
    
                ViewModel.YouItems.Repopulate(searchResults);
            }
            catch (OperationCanceledException)
            {
                // Expected
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
            }
        }
    };
    

    您希望在实际执行搜索之前等待 。 中途杀死搜索任务可能导致未定义的行为。

    您想要保存当前的搜索过滤器,并在1秒钟后再次进行比较。 如果这没有改变,请进行搜索。 否则,终止:

    searchBar.TextChanged += async (sender, e) => 
    {
        var filter = searchBar.Text;
        await Task.Run(() =>
        {
            Thread.Sleep(1000);
            if (filter == searchBar.Text)
                listview.QueryToDB(searchBar.Text);
        });
    };
    

    为了保持视图模型更新,请将您的isBusy赋值QueryToDB因为这是视图模型真正忙的时候:

    public void QueryToDB(string filter)
    {
        this.BeginRefresh ();
        ViewModel.isBusy = true;
    
        // do your search
    
        ViewModel.isBusy = false;
        this.EndRefresh ();
    }
    
    链接地址: http://www.djcxy.com/p/87445.html

    上一篇: Dynamically search with interrupts,via Tasks C#

    下一篇: TF400898 error after upgrading to TFS 2015