2014-02-10 3 views
0

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

protected override void OnStop() 
    { 
     /* 
     * Check, whether the business process is currently running; 
     */ 
     if (_sh.IsBusinessProcessRunning()) 
     { 
      eventLog1.WriteEntry(String.Format(
       "Stop instruction received! Service will be stopped, as soon the process '{0}' has completed. ", 
       ServiceHelper._businessExecutableName)); 
     } 
     while (_sh.IsBusinessProcessRunning()) 
     { 
      // Check each 30 seconds, whether the business process is still running 
      Thread.Sleep(30000); 
     } 

     eventLog1.WriteEntry("Service stopped!"); 
    } 

На самом деле это работает отлично, за исключением того, что я получаю тайм-аут, диалоговое окно ошибки, которые могут ввести в заблуждение клиента. Есть ли способ изменить сообщение в этом диалоговом окне или избежать его отображения? (Я бы предпочел, чтобы обновить сообщение, если это возможно)


Сообщение:

Сервис "..." на "локальный" не может быть прекращено. Служба не ответила на запрос запуска или контроля своевременно.

+0

Можете ли вы перевести сообщение на английский, пожалуйста :) – OuSs

+0

Вам нужно найти способ сохранить состояние этого бизнес-процесса и выйти. Ваш процесс может быть вырван из-под вас, если вы откажетесь закрыть его, когда OS просит вас. И создание «неудобных» сервисов начинает входить в область вредоносного ПО. –

+1

Кроме того, конечно, если кто-то может попытаться остановить ваше обслуживание, они также могут почти наверняка заставить машину выключиться или перезагрузиться - так как вам нужно будет справиться с * этой * ситуацией таким образом, чтобы она не включалась бесконечно откладывая завершение работы, используйте любую стратегию, которую вы разрабатываете, чтобы справиться с этим, чтобы справиться с «Стоп». –

ответ

1

Вы спали в течение 30 секунд, но Windows обычно дает ~ 12 секунд, чтобы выключить службу, чтобы вы легко превзошли ее, что вызывает появление этого диалогового окна.

Вы можете запросить дополнительное время, позвонив по телефону ServiceBase.RequestAdditionalTime, который должен сообщить SCM, что ваша услуга еще отвечает, что он просто занят.

Я также не использовал бы Thread.Sleep для такого большого блока времени. Уменьшите это на пару секунд, так или иначе.

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