6

onStart()顧客がライセンスを持っていない場合、メソッドで Windows サービスを停止したい。を使用していますservice.Stop()が、動作しません。

protected override void OnStart(string[] args)
{
    try
    {
        _bridgeServiceEventLog.WriteEntry("new OnStart");
        if (LicenseValidetor.ValidCountAndTypeDevices())
        {
            WsInitializeBridge();
        }
        else
        {
            service = new ServiceController("BridgeService");
            service.Stop();
            _bridgeServiceEventLog.WriteEntry("LicenseValidetor Error");
        }
        _bridgeServiceEventLog.WriteEntry("end Start");
    }
    catch (Exception e)
    {
        _bridgeServiceEventLog.WriteEntry("error In onstart method ");
    }

}
4

3 に答える 3

7

OnStart同じサービスのメソッド内からサービスを停止することはできません。

ServiceController.Stopメソッドは内部的に呼び出しますControlService(または対応するメソッドEx)。この関数が失敗する理由の 1 つは次のとおりです。

ERROR_SERVICE_CANNOT_ACCEPT_CTRLサービスの状態がSERVICE_STOPPEDSERVICE_START_PENDING、またはSERVICE_STOP_PENDING であるため、要求された制御コードをサービスに送信できません。

OnStartメソッドの内部にいるとき、サービスの状態は ですSERVICE_START_PENDING


この状況に対処する正しい方法は、開始した可能性のある他のスレッドにシグナルを送って終了させて​​から、OnStartメソッドを終了することです。サービス コントロール マネージャーは、プロセスが終了したことを認識し、サービス ステータスを に戻しますSERVICE_STOPPED。また、インタラクティブなユーザーに、「サービスが開始され、その後停止されました」またはその趣旨の言葉を通知する場合もあります。

于 2012-08-22T08:05:01.743 に答える
0

サービスが実際に停止したか、最初のインスタンスで実行されているかを確認するのを待っていないことに気付きました。

これを行う :-

protected override void OnStart(string[] args)
{
    try
    {
        _bridgeServiceEventLog.WriteEntry("new OnStart");
        if (LicenseValidetor.ValidCountAndTypeDevices())
        {
            WsInitializeBridge();
        }
        else
        {
            int time = 10000;

            TimeSpan timeout = TimeSpan.FromMilliseconds(time);

            service.Stop();
            service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

            _bridgeServiceEventLog.WriteEntry("LicenseValidetor Error");
        }
        _bridgeServiceEventLog.WriteEntry("end Start");
    }
    catch (Exception e)
    {
        _bridgeServiceEventLog.WriteEntry("error In onstart method ");
    }
}
于 2012-08-22T08:33:07.303 に答える
0

「単純にワーカーを開始しない」ことは機能しない可能性があることを付け加えておきます(または、おそらく私は単純に愚かです;))。

OnStart コードに try/catch(all) を使用してサービスを構築しました。.config ファイルに行がないため、ワーカー スレッドを開始する前に IOException でクラッシュしました。例外がスレッド スターターをスキップしました。私のコードによって開始されたスレッドはありません。本音をいうと。

しかし、サービスは停止しませんでした。どうしてか分かりません。必死の手段として、私は例外を再スローしました。

Enterprise Library 構成のファイル システム ウォッチャー スレッドが問題だったのではないかと考えています。EntLib は私のコードに深く織り込まれており、実験としてそれを削除したため、これ以上調査しませんでした。

于 2013-12-02T17:33:06.393 に答える