0

次の関数を使用して、Windows サービスを停止しています (タイムアウトあり)。

public int StopService()
{
    ServiceController service = new ServiceController(serviceName);
    try
    {
        TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
        service.Stop();
        service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);              
        return 1;
    }
    catch (Exception ex)
    {
        logger.Log(LoggingLevel.Error,
                this.GetType().Name + ":" + MethodBase.GetCurrentMethod().Name,
                string.Format("{0}", ex.Message));
        return -1;
    }
}

サービスの状況を確認します。そうでない場合は、ServiceControllerStatus.Stoppedこの関数を呼び出します。テストしたところ、サーバーのステータスがRunningまたはStoppedのときにプログラムが動作します。しかし、ステータスがStopPendingStartPendingなどの他の状態の場合に何が起こるかを知りたいです。状態が上記のいずれかであるときにサービスを停止するように指示した場合、Stop コマンドは引き続き機能しますか?

4

2 に答える 2

1

これは、サービスと、Stop() の呼び出し時に何が許可されるかによって異なります。

Win32 レベルでは、各サービスは定期的にSetServiceStatus()を呼び出して、受け入れるコマンドをサービス コントロール マネージャー (SCM) に通知する必要があります。Stop() への呼び出しは、サービスがその操作を許可することを明示的に示している場合にのみ成功します。私の経験では、通常、保留状態のサービスは通常の範囲の操作を許可しないため、Stop() の呼び出しは失敗する可能性があります。

このサンプル コードの例の見出しの下に示されているように、C# で何が許可されているかを簡単に確認できます。Stop() への呼び出しの前に CanStop() を付けて、サービスがまだ停止する準備が整っていない場合は、しばらく待つことができます。不測の事態はたくさんあります。

于 2014-10-15T16:51:50.817 に答える
0

以下のように試すことができます。以下の StopPending の例では、

while (service.Status == ServiceControllerStatus.StopPending) //If it is stop pending, wait for it
                {
                    System.Threading.Thread.Sleep(30 * 1000); //  thread sleep for 30 seconds
                    service.Refresh(); // refreshing status

                    if (service.Status == ServiceControllerStatus.Stopped)
                    {
                        Comments = "Service " + serviceName + " stopped successfully. ";

                    }
                }

それが機能するかどうか教えてください。より良い解決策があれば提供してください

于 2015-06-25T12:04:14.047 に答える