Завершение длительного процесса в службе Windows

У меня есть служба Windows, которая выполняет длительный процесс. Он запускается таймером, и весь процесс может занять несколько минут. Когда таймер истекает, служба создает экземпляр объекта управления, который выполняет различные задачи, регистрирует результаты и затем завершает работу.

Я ничего не реализовал для обработки тех случаев, когда сервер отключается в середине процесса. Это может вызвать некоторые проблемы. Как лучше всего справиться с этим?


person user50622    schedule 15.07.2009    source источник


Ответы (2)


Могу только дать расплывчатые предложения, так как я не знаю, какую задачу вы на самом деле выполняете.

Если что-то делать с базой данных, есть транзакция, которую можно откатить, если она не зафиксирована.

Если это связано с некоторыми манипуляциями с файлами, возможно, ознакомьтесь с этой статьей. на транзакционной NTFS. Вы можете использовать его в сочетании с объектом TransactionScope для обеспечения атомарной транзакции.

Если вы имеете дело с веб-сервисами, то граница сервиса будет диктовать, когда одна транзакция начинается/заканчивается, а когда начинается другая, используйте компенсационную модель (если вы что-то сломаете со своей стороны, вам нужно предоставить способ позже, после восстановления , способ уведомления/выполнения компенсационных сценариев на другом конце (подумайте о заказе книги онлайн и о том, как справиться с задержкой заказа, отменой и т. д.).

Для механизма отслеживания регистрируйте все шаги и сроки устранения неполадок, если происходит что-то вроде отключения.

person Jimmy Chandra    schedule 15.07.2009

Если вы описываете, по сути, пакетный процесс, вполне нормально иметь таймер, который работает с интервалом - большая часть мира работает именно так.

Если он работает долго, старайтесь, чтобы ваши единицы работы или партии были достаточно малы, чтобы ваш процесс мог хотя бы проверить, был ли ему дан сигнал об остановке или нет. Это позволит службе корректно завершить работу вместо того, чтобы игнорировать сообщение об остановке службы.

Где-то в вашей функции таймера у вас есть свойство IsShutdownRequired или что-то подобное, которое вы проверяете (при условии некоторой обработки цикла). Этому свойству присваивается значение true в управляющем сообщении об остановке службы, что позволяет вашему процессу корректно завершаться, либо не пытаясь выполнить дополнительную работу, либо, как предложил Джимми, откатывая эту работу, если она находится в транзакции.

В идеале небольшие партии лучше, чем одна большая.

person Zach Bonham    schedule 07.08.2009