2016-11-15 172 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返回后,我一直在寻找停留在停止状态的方法。我参考的演练中,您已将状态设置为OnStart方法中的START_PENDING;从你的评论我猜这也是不必要的。并在方法结束时将状态设置为RUNNING;我猜也是不必要的。 – Will

回答

0

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

看来,一旦你从OnStop()返回,你无条件终止,但这只是一个猜测。