2016-11-15 171 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()返回,你無條件終止,但這只是一個猜測。