2013-07-18 2 views
0

У меня есть приложение, которое отправляет письма по расписанию. Иногда приложение застревает при отправке электронной почты, я все еще не уверен, почему.Реализовать сторожевой таймер для критических задач

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

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

Спасибо, Омер

+0

Вы, вероятно, захотите выяснить, почему * он «застревает» в первую очередь. Затем вы можете подумать об эффективных контрмерах, которые могут включать задачу сторожевого пса или другие. – JimmyB

+0

Это взломать. Но когда надвигается крайний срок, вы можете уйти от него. Сосредоточьтесь на поиске причин, по которым «приложение застревает» после того, как вы внедрили этот взлом. –

+0

Эта ошибка обычно происходит в какой-то «счастливой» системе заказчика, не воспроизводится и т. Д. –

ответ

1

Это не такая уж плохая идея имхо.

Основная ошибка, которую я вижу здесь, не является технической, но гуманной: после того, как сторожевой таймер работает и делает это правильно, и клиенты больше не жалуются, слишком легко просто сказать «проблема решена!» и забыть об исходной проблеме (в лучшем случае отбросив ее на отставание, обозначив ее как «разрешенную» в худшем случае).

С технической стороны:

Вы можете рассмотреть уровень изоляции барбоса и применения, и как насильственные действия сторожевых таймера есть. Минимальная изоляция состоит в том, что сторожевой таймер работает в другом потоке (одноразовый таймер сделает это). Возможно, было бы лучше, чтобы механизм электронной почты и сторожевой таймер выполнялись на разных AppDomains, поэтому сторожевой таймер выгружает всю «электронную почту AppDomain» при тайм-ауте. Это дает вам аналогичное разрешение на убийство процесса (по крайней мере, под «управляемой» точкой зрения), но менее жестоко, чем убийство процесса и его запуск снова.

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

Как говорят комментаторы, Я настоятельно рекомендую отладить выпуск. Вам нужно будет работать с инструментами и инструментами для отладки производства, такими как трассировка, ведение журнала, отладчики времени производства (например, WinDbg) и т. Д., Которые позволяют вам диагностировать и отлаживать невоспроизводимую проблему.