2016-11-15 3 views
0

Я выполнил этот код MSDN walkthrough для написания службы путем получения из ServiceBase. Он предлагает способ вызова SetServiceStatus для указания SERVICE_STOP_PENDING. Я понимаю, это означает, что ваш процесс не будет прекращен до тех пор, пока вы не назовете его SERVICE_STOPPED. Я отменяю OnStop и добавил этот код:SetServiceStatus преуспевает, но, похоже, не имеет эффекта

   checkpoint = 1; 
       // Update the service state to Stop Pending. 
       ServiceStatus serviceStatus = new ServiceStatus(); 

       serviceStatus.dwServiceType = ServiceType.SERVICE_WIN32_OWN_PROCESS; 
       serviceStatus.dwCurrentState = ServiceState.SERVICE_STOP_PENDING; 
       serviceStatus.dwControlsAccepted = 1; 
       serviceStatus.dwWin32ExitCode = 0; 
       serviceStatus.dwServiceSpecificExitCode = 0; 
       serviceStatus.dwCheckPoint = checkpoint++; 
       serviceStatus.dwWaitHint = 10000; 

       SetLastError(0); 
       if (!SetServiceStatus(this.ServiceHandle, ref serviceStatus)) 
        TextOut("OnStop SetServiceStatus failed: " + Marshal.GetLastWin32Error()); 

       timer = new System.Timers.Timer(); 
       timer.Interval = 50; 
       timer.Elapsed += timer_Elapsed; 
       timer.Start(); 

Однако timer_Elapsed не дозвонился, и мой процесс резко прекращаются. Может ли кто-нибудь сказать мне, что я делаю неправильно?

+0

Он уже имеет значение статуса во время выполнения метода OnStop(). Предоставлено ServiceBase. Поэтому нет очевидной причины помочь. –

+0

Справа. Я искал способ остаться в состоянии остановки после того, как вернулся с OnStop. Проходной, на который я ссылался, установил статус START_PENDING в методе OnStart; из вашего комментария я бы предположил, что это тоже не нужно; и они устанавливают статус RUNNING в конце метода; также, я полагаю, не нужен. – Will

ответ

0

Я отвечаю на свой вопрос. Я решил использовать простой sleep() в цикле, ожидая завершения процесса очистки, поэтому я не буду использовать ServiceStatus.

Оказалось, что как только вы вернетесь из OnStop(), вас безоговорочно прекратят, но это всего лишь предположение.

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