17

私は一連の Windows サービスを書いています。起動時に(OnStart()メソッドで)エラーがスローされた場合に失敗するようにします。エラーをスローするだけでこれが行われると想定していましたがOnStart()、代わりに「開始」し、「サービスは開始されましたが、非アクティブです。これは正しいですか?」というメッセージが表示されることがわかりました。(言い換え)。実際にサービスの開始に失敗するようにエラーを処理するにはどうすればよいですか?

4

3 に答える 3

16

If the main thing you want is for the Services window to report that there was an error, from what I've tried (.NET3.5 on Windows 7), the only way to do this is by setting the ExitCode. I recommend setting it to 13816, since this results in the message, "An unknown error has occurred." See the windows error codes.

The sample below accomplishes three things.

  1. Setting ExitCode results in a useful message for the end-user. It doesn't affect the Windows Application log but does include a message in the System log.
  2. Calling Stop results in a "Service successfully stopped" message in the Application log.

  3. throwing the exception results in a useful log entry in the Application log.

protected override void OnStart(string[] args) {
    try {
        // Start your service
    }catch (Exception ex) {
        // Log exception
        this.ExitCode = 13816;
        this.Stop();
        throw;
    }  
}
于 2012-08-08T18:22:04.937 に答える
8

.NET 2.0 以降を実行している場合は、ServiceBase.Stopを使用して OnStart からサービスを停止できます。それ以外の場合は、新しいスレッドから Stop を呼び出します。

ref [devnewsgroups] ( http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic50404.aspx )

(ニュースグループはなくなりました)

于 2008-10-01T17:54:39.997 に答える
7

すべての起動ロジックを別のメソッドに移動し、その別のメソッドから例外をスローします (または OnStop を呼び出します)。

OnStart には、起動時に奇妙な点がいくつかあります。OnStart() に 1 行しかない場合、「サービスを開始してから停止しました。実行する作業がない場合、一部のサービスは自動的に停止します」というメッセージが表示されず、スローされた例外によってサービスが終了することがわかりました。処理してアプリ イベント ログに記録します。

セパレート起動方法でも、このような手法でアタッチせずにデバッグできます。http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx

于 2008-10-01T17:49:56.700 に答える