通过任务C#动态搜索中断,
我正在与Db(通过SQLite.NET PCL ,而不是异步版本)。 在当前时刻我有一些数据(从数据库中获取)列表视图,还我有一个搜索栏/项(其NVM),其中用户可以输入一些值,然后,通过LINQ我要去进行查询和更新SourceItems我的名单。
所以问题出现在性能上,因为我的数据库有100万条记录,而且简单的LINQ查询工作速度非常慢。换句话说,当用户输入的数据太快时,应用程序会有巨大的滞后,有时会出现崩溃 。
为了解决这个问题,我想到了一些东西(理论上的解决方案):
1)需要在任务中放置方法(我将查询放入数据库中)(解锁我的主UI线程)
2)初始化定时器,然后开启并:
类似的东西(类似)或任何建议。谢谢!
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.Run
和CancellationTokenSource
:
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