2011-09-13 341 views
11

私はデバッグしようとしているWindowsサービスを持っています。今は、現在のコードが動作していたとしても、起動に失敗します。エラーは次のとおりです。サービスは指定時間内に開始または制御 要求に応答しませんでした:Windowsサービスが起動しない(エラー1053)

Windowsは、ローカルコンピュータ上

エラー1053 MyServiceでサービスを開始できませんでした。

エラーを特定するために、すべてをコメントアウトしようとしました。主な方法は次のようになります。

TextWriter tt = new StreamWriter(@"C:\startup.text", true); 
tt.WriteLine("Starting up the service"); 
tt.Close(); 

ServiceBase[] ServicesToRun; 
ServicesToRun = new ServiceBase[] 
    { 
     new MyService() 
    }; 

TextWriter tt2 = new StreamWriter(@"C:\startup.text", true); 
tt2.WriteLine("Run..."); 
tt2.Close(); 

これは、「サービスの起動」と「ファイル名を指定して実行」のログ・ファイルの両方に出力します。 MyServiceの内部も取り除いて空にしました。任意のコードの周りにtry/catchがありますが、これは上のようないくつかのログ行に縮小されています。私はそれを記録していたcatchステートメントを入力しません。 OnStartメソッドで

すべてがコメントアウトされています:

protected override void OnStart(string[] args) 
{ 
} 

は、だから私は、アイデアのうち、基本的です。 Startメソッドが終了しない(または30秒以内に)ため、エラーが発生していると思いました。他の方法がありますか?任意のアイデアが評価されます。

追加情報: MyServiceのコンストラクタは空です。いくつかのThread.Sleep(5000)行を挿入すると、Error 1053に関するエラーメッセージが表示されるまでに時間がかかります。 Mainメソッドは(エラーなしに)終了しなければならないようです。

+0

未処理の例外をすべてキャッチし、あなたのログに。例えば:http://stackoverflow.com/questions/58280/unhandledexception-handler-in-a-net-windows-service ...それはあなたになぜ失敗しているかについてのいくつかのより多くの情報を与えるかもしれません。 –

答えて

15

あなたはServiceBase.Runコール不足していますので、.NET/

static void Main() { 
    ... 
    AppDomain.CurrentDomain.UnhandledException 
             += CurrentDomain_UnhandledException; 
    ... 
} 

private static void CurrentDomain_UnhandledException(
               Object sender, 
               UnhandledExceptionEventArgs e) { 

    if (e != null && e.ExceptionObject != null) { 
     // log exception: 
    } 
} 

とのOnStartに次のtry/catchを追加します。また、未処理の例外通知を購読するには良い考えかもしれません

ServiceBase[] servicesToRun = new ServiceBase[] 
           { 
            new MyService() 
           }; 
ServiceBase.Run(servicesToRun); 

をSCMが例外を取り除く:

protected override void OnStart(String[] args) { 
    try { 

    } catch(Exception e) { 
     // log exception: 
     throw; 
    } 
} 
+1

また、サービスの初期化をデバッグする場合は、初期化コードにSystem.Diagnostics.Debugger.Break()を呼び出すことができます。この行に達すると、デバッガを起動するかどうか尋ねられます。デバッガを起動すると、その時点からサービスをデバッグできます。 – Polyfun

+1

ありがとうございます。 ServiceBase.Run(servicesToRun);ラインはこのプロセスでコメントアウトされました。 –

+1

私にとっては、 'ServiceBase.Run(serviceToRun);を呼び出さずに実行するデバッグ条件セットでした。 – absynce

関連する問題