我的一款数据密集型wp7应用程序的数据持久化方式如下:我维护一个反映所有用户活动的更改日志,并且每隔几秒钟,一个线程计时器会启动一个线程池线程,将更改日志刷新到事务内的数据库中。它看起来像这样:
当用户退出时,我停止计时器,在UI线程上刷新日志(不需要超过一两秒),并卸载数据库。
但是,如果用户退出时工作线程处于活动状态,我无法找出如何优雅地处理。系统似乎杀死了工作线程,因此它永远不会完成其工作并永远不会放弃对数据库连接的锁定,然后ui线程尝试获取锁定,并立即被系统杀死。我尝试在UI线程上设置一个标志,请求工作线程中止,但我认为工作线程在读取标志之前就被打断了。除了这种情况外,一切都运行良好,其中某些用户更改未保存到数据库中,我似乎无法解决这个问题。
下面是非常简化的代码:
当用户退出时,我停止计时器,在UI线程上刷新日志(不需要超过一两秒),并卸载数据库。
但是,如果用户退出时工作线程处于活动状态,我无法找出如何优雅地处理。系统似乎杀死了工作线程,因此它永远不会完成其工作并永远不会放弃对数据库连接的锁定,然后ui线程尝试获取锁定,并立即被系统杀死。我尝试在UI线程上设置一个标志,请求工作线程中止,但我认为工作线程在读取标志之前就被打断了。除了这种情况外,一切都运行良好,其中某些用户更改未保存到数据库中,我似乎无法解决这个问题。
下面是非常简化的代码:
private Timer _SweepTimer = new Timer(SweepCallback, null, 5000, 5000);
private volatile bool _BailOut = false;
private void SweepCallback(object state) {
lock (db) {
db.startTransaction();
foreach(var entry in changeJournal){
//CRUD entry as appropriate
if(_BailOut){
db.rollbackTransaction();
return;
}
}
db.endTransaction();
changeJournal.Clear();
}
}
private void RespondToSystemExit(){
_BailOut = true; //Set flag for worker to exit
lock(db){ //In theory, should acquire the lock after the bg thread bails out
SweepCallback(null);//Flush to db on the UI thread
db.dismount();//App is now ready to close
}
}