Перестает работать служба Windows, утилизация исправляет - PullRequest
0 голосов
/ 24 февраля 2009

У меня есть служба Windows, у которой есть таймер, который запускает метод каждые 30 секунд.

Затем метод вызывает thread.sleep (), а когда он завершает работу, вызывает thread.start ();

Весь код в методе упакован в try / catch, за исключением вызовов режима сна / start.

По какой-то причине служба перестает работать, но если я перезапускаю ее или настраиваю на утилизацию после сбоя, она работает нормально.

Как я могу диагностировать проблему?
Есть ли другие события, такие как OnCrash или somethign, к которым я могу подключиться, чтобы копаться в трассировке стека?

Ответы [ 5 ]

0 голосов
/ 27 июля 2011

Вы можете использовать Microsoft Debug Diagnostic Tool v1.1 для мониторинга службы и создания дампа при его сбое. Затем вы можете отладить дамп.

http://www.microsoft.com/download/en/details.aspx?id=24370

0 голосов
/ 24 февраля 2009

Служба Windows - это то же самое, что и обычное приложение, просто она выполняется по-другому. Поэтому спросите себя, не сработало ли ваше обычное приложение, но перестало работать, что могло его вызвать? На ум приходят такие вещи, как проблемы с блокировками, проблемы параллелизма и т. Д. *

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

Другой вариант - присоединить отладчик Visual Studio к службе Windows и отладить как обычно.

0 голосов
/ 24 февраля 2009

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

0 голосов
/ 24 февраля 2009

Это таймер! . Избавьтесь от этого, и ваша проблема будет решена.

Проверьте это сообщение для получения дополнительной информации.

Вам лучше делать такую ​​операцию ...

While (stopSignal = False)
 'do your work'
 Thread.Sleep(yourInterval)
End While

РЕДАКТИРОВАТЬ: Если вы хотите отладить службу и не должны страдать от присоединения отладчика, то выполните this .

Независимо от того, согласны вы с этим или нет, MS подтвердила, что это ошибка , и удаление таймера - единственный способ избежать этой проблемы. Вы также не должны использовать исключения в качестве управления потоком программ (Catch and Retry), если можете помочь.

0 голосов
/ 24 февраля 2009

Нет, нет, но почему бы просто не попробовать или поймать себя и записать исключение, когда оно происходит?

Кроме того, я нахожу призыв к Сну и Начать очень сомнительным. Вы не должны использовать эти вызовы в целом для синхронизации. Почему вы делаете эти звонки?

...