Мое приложение wp7 с большим объемом данных сохраняет данные следующим образом: я веду журнал изменений, отражающий все действия пользователя, и каждые несколько секунд таймер потока запускает поток пула потоков, который сбрасывает журнал изменений в базу данных внутри транзакции. , Это выглядит примерно так:
Когда пользователь выходит из системы, я останавливаю таймер, очищаю журнал в потоке пользовательского интерфейса (занимает не более секунды или двух) и отключаю БД.
Однако, если рабочий поток активен , когда пользователь выходит, я не могу понять, как изящно реагировать. Кажется, что система уничтожает рабочий поток, поэтому она никогда не завершает свою работу и никогда не снимает свою блокировку на соединении с базой данных, а поток пользовательского интерфейса затем пытается получить блокировку и немедленно уничтожается системой. Я попытался установить флаг в потоке пользовательского интерфейса, запрашивая отмену работника, но я думаю, что рабочий был прерван, прежде чем он прочитал флаг. Все работает отлично, за исключением этого сценария «1 на 100», когда некоторые пользовательские изменения не сохраняются в БД, и я не могу обойти это.
Очень упрощенный код ниже:
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
}
}