【发布时间】:2015-11-10 13:29:01
【问题描述】:
我正在使用 Db(通过 SQLite.NET PCL,不是异步版本)。目前我有一个 listview 和一些数据(取自 db),我也有一个搜索栏/条目(它的 nvm),用户可以在其中输入一些值,然后通过 LINQ 我将查询并更新我的列表的 SourceItems。
所以问题在于性能,因为我的 DB 有数百万条记录,而简单的 LINQ 查询工作非常缓慢。换句话说,当用户输入一些数据太快时,应用程序延迟很大,有时会崩溃。
为了解决这个问题,我想到了一些事情(理论上的解决方案):
1)需要将方法(我在数据库中查询)放在任务上(解锁我的主 UI 线程)
2)初始化定时器,然后开启:
- 如果过了 1 秒,那么 => 在任务上运行我的方法(查询)(类似于后台线程)
- 如果没有超过 1 秒,则退出匿名方法。
类似的东西(类似的)或任何建议。谢谢!
UPD:
所以说实话,我尝试了太多并没有得到好的结果
顺便说一句,我当前的代码(片段):
1)我的搜索方法
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对不起我的英语。技能!
【问题讨论】:
标签: c# multithreading task-parallel-library search-engine xamarin.forms