Когда роль (рабочую или веб-роль) просят корректно завершить работу (поскольку она сокращается или потому что вы запросили повторное развертывание), OnStop вызывается метод класса RoleEntryPoint. Это тот же класс, в котором есть метод Run, который, вероятно, либо содержит ваш цикл, либо вызывает код, содержащий этот цикл.
Здесь следует отметить пару вещей: у OnStop есть 5 минут, чтобы фактически остановиться, после чего процесс просто уничтожается. Если вам нужно вызвать что-то еще для асинхронного завершения работы, вам нужно, чтобы поток в OnStop был занят, ожидая, пока этот другой процесс не будет закрыт. Как только выполнение перешло в состояние OnStop, платформа предполагает, что машину можно остановить.
Если вам нужно изящно остановить обработку, но это не требует выключения машины, вы можете поместить параметр в файл конфигурации службы, который вы можете обновить, чтобы указать, что работа должна быть выполнена или сделана заметка. Так, например, логическое значение «ProcessQueues». Затем в onStart в RoleEntryPoint вы перехватываете событие RoleEnvironmentChanging. Затем ваш обработчик событий ищет событие RoleEnvironmentConfigurationSettingChange, а затем проверяет логическое значение ProcessQueues. Если это правда, он либо запускает, либо продолжает обработку, если это ложь, он изящно останавливает обработку. Затем вы можете изменить конфигурацию, чтобы контролировать, когда что-то работает или нет. Это один из вариантов обработки, и есть еще много других, в зависимости от того, как быстро вам нужно остановить обработку и т. д.
person
MikeWo
schedule
30.09.2012