SetServiceStatus成功,但似乎没有效果

本文关键字:有效果 成功 SetServiceStatus | 更新日期: 2023-09-27 18:18:00

我遵循MSDN演练,通过从ServiceBase派生来编写服务。它建议调用SetServiceStatus来指示SERVICE_STOP_PENDING的方法。我认为这意味着你的进程不会被终止,直到你用SERVICE_STOPPED调用它。我覆盖了OnStop并添加了以下代码:

                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没有被调用,我的进程突然终止。谁能告诉我我哪里做错了?

SetServiceStatus成功,但似乎没有效果

我在回答自己的问题。我决定在等待进程完成清理时在循环中使用一个简单的sleep(),所以我不会使用ServiceStatus。

似乎一旦你从OnStop()返回,你就被无条件终止了,但这只是一个猜测。