C# 带有SQLite Db的Windows Phone 8.1(RT)应用程序,包含67k元素。工作缓慢
我为“WindowsPhone8.1”开发了一个应用程序,在那里我正在使用一个包含4700个项目的数据库。在“Windows应用商店应用程序8.1/10(桌面/平板电脑)”上,应用程序运行速度很快,但“Windows Phone 8.1”可以看出“UI”运行缓慢且滞后。这里是对性能分析器的分析 当应用程序启动方法“OnLaunching”时,我将数据从sqlite存储库加载到静态类中的静态属性“IEnumerable”C# 带有SQLite Db的Windows Phone 8.1(RT)应用程序,包含67k元素。工作缓慢,c#,sqlite,windows-phone-8.1,windows-store-apps,C#,Sqlite,Windows Phone 8.1,Windows Store Apps,我为“WindowsPhone8.1”开发了一个应用程序,在那里我正在使用一个包含4700个项目的数据库。在“Windows应用商店应用程序8.1/10(桌面/平板电脑)”上,应用程序运行速度很快,但“Windows Phone 8.1”可以看出“UI”运行缓慢且滞后。这里是对性能分析器的分析 当应用程序启动方法“OnLaunching”时,我将数据从sqlite存储库加载到静态类中的静态属性“IEnumerable” await Task.Run(async () => {
await Task.Run(async () =>
{
if (InstanceMessageService.AllHolidays == null)
{
InstanceMessageService.AllHolidays = _repository.GetAll();
InstanceMessageService.AllCountries = await Task.Run(() =>
InstanceMessageService.AllHolidays.GroupBy(holiday => holiday.Country)
.Select(x => x.First().Country)
.Select(s => new Country()
{
Title = s,
FirstLetter = s[0].ToString()
}).ToList()
);
if (!InstanceMessageService.AllHolidays.Any() || !InstanceMessageService.AllCountries.Any())
{
throw new Exception("Cannot load SQLite data");
}
}
});
这里是InstanceMessageService
public static class InstanceMessageService
{
public static IEnumerable<Holiday> AllHolidays { get; set; }
public static IEnumerable<Country> AllCountries { get; set; }
...
}
公共静态类InstanceMessageService
{
公共静态IEnumerable AllHolidays{get;set;}
公共静态IEnumerable AllCountries{get;set;}
...
}
现在4700个假日项目包含在静态属性(内存中)中,还有171个国家/地区项目。我认为这不是个好办法
这是CalendarsPage的ViewModel代码。CalendarsPage提供今天、明天或从calendar控件中选择的具体日期的假日数据
public class CalendarPageViewModel : INotifyPropertyChanged
public IEnumerable<Holiday> Holidays
{
get { return _holidays; }
set
{
_holidays = value;
OnPropertyChanged("Holidays");
}
}
public ObservableCollection<Holiday> TodayHolidays
{
get { return _todayHolidays; }
set
{
_todayHolidays = value;
OnPropertyChanged("TodayHolidays");
}
}
public ObservableCollection<Holiday> TomorrowHolidays
{
get { return _tomorrowHolidays; }
set
{
_tomorrowHolidays = value;
OnPropertyChanged("TomorrowHolidays");
}
}
public ObservableCollection<Holiday> SelectedDateHoliday
{
get { return _selectedDateHoliday; }
set
{
_selectedDateHoliday = value;
OnPropertyChanged("SelectedDateHoliday");
}
}
public CalendarPageViewModel()
{
Task task = InitCollections();
InitCommands();
}
**// Slowly magic here**
private async Task InitCollections()
{
Holidays = InstanceMessageService.AllHolidays;
TomorrowHolidays = new ObservableCollection<Holiday>(await Task.Run(() => Holidays.Where(holiday => holiday.Date == DateTime.Now.AddDays(1).Date.ToString("MMM d")).Select(holiday => holiday)));
TodayHolidays = new ObservableCollection<Holiday>(await Task.Run(() => Holidays.Where(holiday => holiday.Date == DateTime.Now.Date.ToString("MMM d")).Select(holiday => holiday)));
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
公共类CalendarPageViewModel:INotifyPropertyChanged
公众假期
{
获取{return\u假日;}
设置
{
_假期=价值;
不动产变更(“节假日”);
}
}
今日公众假期
{
获取{return\uTodayHolidays;}
设置
{
_今天的假期=价值;
房地产变更(“今日假期”);
}
}
明日全日公众可观察到的收集
{
获取{return}
设置
{
_明天=价值;
房地产变更(“明天”);
}
}
公众可观察收集选定日期假日
{
获取{return\u selectedDateHoliday;}
设置
{
_selectedDateHoliday=值;
酒店变更(“选定日期假日”);
}
}
公共日历页面视图模型()
{
Task Task=InitCollections();
InitCommands();
}
**//慢慢变魔术**
专用异步任务InitCollections()
{
假日=InstanceMessageService.AllHolidays;
TomorrowHolidays=newobserveCollection(wait Task.Run(()=>Holidays.Where(holiday=>holiday.Date==DateTime.Now.AddDays(1.Date.ToString)(“mmmd”))。选择(holiday=>holiday));
TodayHolidays=newobserveCollection(wait Task.Run(()=>Holidays.Where(holiday=>holiday.Date==DateTime.Now.Date.ToString(“MMM d”))。选择(holiday=>holiday));
}
公共事件属性更改事件处理程序属性更改;
[NotifyPropertyChangedInvocator]
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
如果(PropertyChanged!=null)PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
存储库类代码
public class HolidaysRepository : IRepository<Holiday>
{
private readonly IDatabaseConnection _databaseConnection;
public HolidaysRepository(IDatabaseConnection databaseConnection)
{
_databaseConnection = databaseConnection;
}
public List<Holiday> GetAll()
{
return _databaseConnection.Connection.Table<Holiday>().ToList();
}
public void AddOrUpdate(Holiday entity)
{
if (_databaseConnection.Connection.Table<Holiday>().FirstOrDefault(item => item.Id == entity.Id) !=
null)
{
Update(entity);
}
else
{
Add(entity);
}
}
public void Add(Holiday entity)
{
_databaseConnection.Connection.Insert(entity);
}
public void Update(Holiday entity)
{
_databaseConnection.Connection.Update(entity);
}
public void Delete(Holiday entity)
{
_databaseConnection.Connection.Delete(entity);
}
public void Clean()
{
_databaseConnection.Connection.DeleteAll<Holiday>();
}
}
public class HolidaysRepository:IRepository
{
专用只读IDatabaseConnection\u数据库连接;
公共假期存储(IDatabaseConnection数据库连接)
{
_databaseConnection=数据库连接;
}
公共列表GetAll()
{
返回_databaseConnection.Connection.Table().ToList();
}
公共无效添加或更新(假日实体)
{
if(_databaseConnection.Connection.Table().FirstOrDefault(item=>item.Id==entity.Id)=
空)
{
更新(实体);
}
其他的
{
添加(实体);
}
}
公共作废添加(假日实体)
{
_databaseConnection.Connection.Insert(实体);
}
公共作废更新(假日实体)
{
_databaseConnection.Connection.Update(实体);
}
公共作废删除(假日实体)
{
_databaseConnection.Connection.Delete(实体);
}
公共空间清洁()
{
_databaseConnection.Connection.DeleteAll();
}
}
在应用程序中,我使用“Ninject”作为“ServiceLocator”,这可能很重要
如何提高应用程序的速度?如何减少RAM的使用量?如果4700个元素使应用程序运行缓慢,UI运行缓慢,那么我认为67000个项目将没有足够的RAM。当加载大量数据需要比您希望的更多的时间时,最简单的解决方案通常是加载更少的数据 您真的需要加载数据库中的所有假日吗?
您能否只加载所需的特定日期?例如,默认情况下,只需加载今天和明天的任何假日,然后查找用户选择的任何特定其他日期 如果您不需要所有假期,但确实必须加载所有国家/地区,那么单独存储这些国家/地区的列表可能比加载所有假期以提取国家/地区要快 在查询数据库中的数据时,应确保具有适当的索引,以便快速查找
可能还需要查看数据上的索引,以便您可以直接从数据库中搜索数据,而不是将其全部加载到一个列表中,然后您可能会进行搜索。我认为您不希望一次加载所有数据。为什么不加载今天、明天和选定日期的假期呢。或者,如果你的应用程序有月视图,只需加载上个月、本月和下个月的数据。谢谢你的回复。我尝试过这样做,但是UI的速度并没有变快。也许我应该在加载数据时添加动画。也许sqlite可以