Я выполнил этот код 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 не дозвонился, и мой процесс резко прекращаются. Может ли кто-нибудь сказать мне, что я делаю неправильно?
Он уже имеет значение статуса во время выполнения метода OnStop(). Предоставлено ServiceBase. Поэтому нет очевидной причины помочь. –
Справа. Я искал способ остаться в состоянии остановки после того, как вернулся с OnStop. Проходной, на который я ссылался, установил статус START_PENDING в методе OnStart; из вашего комментария я бы предположил, что это тоже не нужно; и они устанавливают статус RUNNING в конце метода; также, я полагаю, не нужен. – Will