2016-11-15 12 views
0

これに続いて、ServiceBaseから派生してサービスを書き込むためのMSDN walkthroughが続きました。 SERVICE_STOP_PENDINGを示すSetServiceStatusを呼び出す方法を示します。これは、あなたが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()から戻ると、無条件に終了したように見えますが、それは単なる推測です。

関連する問題