2012-04-16 6 views
0

У меня есть служба Windows C#. когда я пытаюсь остановить, он переходит в состояние остановки, и когда я помещал точку останова в методе onStop, тогда он не попадает. Не удалось отладить проблему. Я добавил обработку исключений по всей службе, а также необработанную обработку исключений, но я не получаю никаких ошибок. Все отлично с servie, у которого hasStop установлен на true, а также использует RequestAdditionalTime().C# Window Service OnStop не получает вызов

У меня также установлен legacyUnhandledExceptionPolicy enabled = "true" в app.config. Но никакой помощи. Для меня это выглядит как проблема с потоками/ресурсами, которые не позволяют диспетчеру управления службам вызвать метод OnStop. Или служба может находиться в уже поврежденном состоянии, и диспетчер управления сервисом не может ее остановить. Он просто меняет состояние с Stop на Stopping.

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

В методе Onstart начинается поток, который продолжает делать своего рода опрос каждые 30 секунд. Предположим, что метод onStop вызывается, тогда он прервет этот поток. Так развивается эта услуга. Может кто-нибудь, пожалуйста, посоветуйте мне, как отладить эту проблему?

Есть ли свободные инструменты для отладки, если есть какая-то проблема с потоками, или мой поток в методе OnStart заставляет доступный ресурс диспетчеру управления сервисом? Пожалуйста, помогите мне, это срочно.

код в методе OnStop:

try 
{ 
    RequestAdditionalTime(10*60*1000); 
    IntPtr handle = this.ServiceHandle; 
    KServiceStatus.currentState = (int) State.SERVICE_START_PENDING; 
    SetServiceStatus(handle, ref KServiceStatus); 

    RequestAdditionalTime(30000); 

    if ((onStartThread == null) || 
     ((onStartThread.ThreadState & 
      (ThreadState.Unstarted | ThreadState.Stopped)) != 0)) 
    { 
     onStartThread = new Thread(new ThreadStart(KWindowsServiceHandler.OnStart)); 
     onStartThread.Start(); 
    } 

    KServiceStatus.currentState = (int) State.SERVICE_RUNNING; 
    SetServiceStatus(handle, ref KServiceStatus); 
}    

OnStartThread продолжается до запуска службы работает. Это потребовало опроса. Если метод onStop - это вызов (который не вызывается), прервет этот OnStartThread.

Спасибо,

Камаль

+1

Есть ли в потоке службы Thread.Join() где угодно? Ожидается любая другая предотвращаемая блокировка блокировки жесткого диска? Если это так, заставьте его уйти. –

+0

..и убедитесь, что Thread.IsBackground настроен на true для всех не основных рабочих потоков, за исключением тех, где необходима эклиптическая очистка. –

+0

в методе OnStart Я не могу назвать thread.join. onStartThread должен продолжать работать, он необходим для опроса каждые 30 секунд. Поэтому мой единственный вариант - прервать OnStartThread, когда служба останавливается. –

ответ

0

Основная проблема заключалась в том, чтобы найти, в чем проблема. Так что продолжал комментировать и раскомментировать другую часть кода и нашел настоящую проблему.OnStartthread запускает процесс (который запускает один exe). Поэтому я сохранил именно этот код в моей службе Windows и удалил все, и я смог воспроизвести проблему. то, что я сделал, это позволить OnStartthread спать в течение 1 с после запуска процесса. (более подходящим было бы начать процесс и поймать разные события, чтобы узнать статус процесса и когда он готов просто двигаться), он работал как магия. Это как-то фиксирует проблему, с которой я столкнулся.

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

//the code is in OnStartThread 

someProcess.start(); Thread.Sleep (1000);

0

Попробуйте использовать Debugger.Break(); в точке, где вы хотите, чтобы сломать исполнение. Или присоединитесь к процессу обслуживания Windows через меню Debug > Attach to process и установите точку останова в Visual Studio.

UPDATE: Если отладчик не привязан к процессу, вы можете сделать это таким образом

if (!Debugger.IsAttached) 
    Debugger.Launch(); 

Почему бы не использовать System.Threading.Timer делать ПОЛЛИНГ каждые 30 секунд?

protected override void OnStart(string[] args) 
{ 
    const int period = 30 * 1000; 
    Timer timer = new Timer(TimerCallback, null, 0, period); 
} 

private void TimerCallback(object state) 
{ 
    // Polling goes here 
} 
+0

Я приложил это к процессу> Работа метода OnStart, но когда я остановлю службу, метод OnStop не вызывается. Точка останова остается отключенной –

Смежные вопросы