Изящно остановить рабочий поток обратного вызова таймера - PullRequest
2 голосов
/ 15 октября 2010

Я использую System.Threading.Timer в своей службе Windows и блокирую метод обратного вызова, используя Monitor.TryEnter, поэтому он не реентерабелен.Внутри обратного вызова я перебираю некоторые объекты базы данных (сущности Linq to SQL) и выполняю некоторые задачи ввода-вывода.На каждой итерации цикла я изменяю некоторые свойства объекта, чтобы пометить его как обработанный.После завершения цикла я вызываю SubmitChanges в текстовом тексте данных, который сохраняет изменения в базе данных.Возникает следующая проблема: если служба останавливается во время выполнения обратного вызова, некоторые задачи ввода-вывода, возможно, уже были выполнены, но записи не были помечены как обработанные в базе данных (т. Е. SubmitChanges еще не был вызван) -ясно, не то, что я хочу, чтобы произошло.Каким-то образом мне нужно сообщить рабочему потоку обратного вызова, что событие OnStop сработало, чтобы позволить ему отправлять изменения и завершать работу.Как лучше это сделать?

Ответы [ 2 ]

1 голос
/ 15 октября 2010

1-й решите, закончите ли вы задачи, которые выполняет обратный вызов, или откатите их.Поэтому, если вы решите завершить задачи, вы выполните обратный вызов до конца.Время должно быть отменено в OnStop уже.Если вы перейдете ко второй опции (откат), ваш код будет выглядеть примерно так:

bool shouldAbort=false;

TimerProc()
{
     Step1();
     if (shouldAbort)
     {
         UndoStep1();
         return;
     }
     Step2();
     if (shouldAbort)
     {
         UndoStep2();
         UndoStep1();  //  or vice versa, depending on your operations
         return;
     }
     // ...
}

в OnStop ()

timer.Stop();  //  don't worry here - your TimerProc() WILL finish
shouldAbort=true;
0 голосов
/ 15 октября 2010

Вы можете посмотреть, используя Task Parallel Library .Прочитайте страницу Отмена задания .Это дало бы вам возможность создавать рабочие потоки, которые могут быть аккуратно убраны в ответ на отмену, если я правильно понял ваши потребности.

...