2

.NET 3.5で作業していますが、ServiceControllerを使用して一部のサービスを停止する際に問題が発生します。インターネット全体を検索しましたが、問題の解決策が見つかりませんでした;)

これが私がそれをする方法です:

using(ServiceController service = new ServiceController( "Service"))
{{
    試す
    {{
        TimeSpanタイムアウト=TimeSpan.FromSeconds(timeoutSeconds);

        service.Stop();
        service.WaitForStatus(ServiceControllerStatus.Stopped、timeout);
    }
    キャッチ(例外例)
    {{
        Console.WriteLine(ex.ToString());
    }
}

サービスが停止するまで待っています。次に、ライブラリを置き換えます(更新します)。そして、例外がスローされます。

UnauthorizedAccessException例外の詳細:System.UnauthorizedAccessException:パス「blablabla」へのアクセスが拒否されました。

アプリケーションを管理者として実行しているので、このパスにアクセスできると確信しています。

このコードが実行されると興味深いのは、このサービスが現在のサービスのリスト(タスクマネージャー内)から消えることです。したがって、実際には停止しますが、一部のスレッドは引き続きそれを使用する必要があるため、サービスのファイルを移動できません。自分でファイルを移動しようとしても(Serviceディレクトリに移動し、マウスを使ってファイルを移動しようとすると)できません。しかし、サービスを手動で停止すると(タスクマネージャーと「タスクの終了」)、そのファイルでやりたいことが何でもできます。では、C#コード(ServiceControllerを使用)から停止することと、タスクマネージャーを使用して停止することの違いは何ですか?

重要かどうかはわかりませんが、このアプリケーション(およびこのサービス)をWindowsServer2008のVirtualBoxで実行しています。(私はそれを他のマシンで実行する必要があり、それから私のコンピューターで実行する必要がありました)。

この問題をどのように解決できますか?;)

助けてくれてありがとう。

ピート、よろしくお願いします。

4

1 に答える 1

5

わかりました、問題を解決しました。

最初にを使って停止しましたAdministrator Command-Prompt Commandが、うまくいきましたが、なぜだろうと思い始めました。答えは時間がかかったということです! 実際に停止しましたが、一部のプロセスはまだそれを使用していました。Net StopServiceServiceController

 service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

また、サービスのステータスを即座に変更したため(Windows Servicesリストの変更は1つだけです)、問題なく動作しましたが、特定のサービスを使用してすべてのスレッドを丁寧に閉じるには時間がかかります:)

だからあなたがする必要があるのはただ待って、それがまだ実行されているかどうかをもう一度確認することです。Processもしそうなら、クラスでそれを殺します。

于 2013-03-04T22:57:01.223 に答える