2013-04-12 17 views
5

私は、Windowsサービスを持っていると私はのOnStart()イベント内のタスクを実行するためのコードを書いている:Windowsサービスの開始時にタスクを実行するには?

protected override void OnStart(string[] args) 
     { 
      this.DoTask(); 
     } 

private void DoTask() 
     { 
      Task task1 = Task.Factory.StartNew(() => this.OriginalFileProcessor.StartPolling()); 

      try 
      { 
       Task.Wait(task1); 
      } 
      catch (Exception ex) 
      { 
       this.Log.Error("Failed running the task", ex); 
      }   
     } 

DoTaskは決して終わることのないループです。サービスが停止した場合にのみ停止します。

しかし、私はサービスを開始しようとすると、それは長い時間が、その後私に以下のエラーが発生します待機:

Windows could not start the ... service on Local Computer. 
Error 1053: The service did not respond to the start or control request in a timely fashion. 

それを解決する方法は?

答えて

7

なぜあなたの仕事が終了するのを待っていますか?

私はTask.Waitがあなたの現在のスレッドをブロックしていると思うので、サービスを開始するときにタイムアウトが発生しています。

EDIT:あなたはこのブロックを削除する必要があります。

try 
{ 
    Task.Wait(task1); 
} 
catch (Exception ex) 
{ 
    this.Log.Error("Failed running the task", ex); 
} 

Task.Waitは確かにあなたの現在のスレッドをブロックしています。 MSDNによると:

Task.Wait Method

Waits for the Task to complete execution.

EDIT 2ではなく

Task task1 = Task.Factory.StartNew(() => this.OriginalFileProcessor.StartPolling()).ContinueWith(t => 
{ 
    var aggException = t.Exception.Flatten(); 
    foreach(var ex in aggException.InnerExceptions) 
     this.Log.Error("Failed running the task", ex); 
}, 
TaskContinuationOptions.OnlyOnFaulted); 
+0

待機は待機中ではありません。つまり、そのタスクからの例外をキャプチャするだけです。 –

+0

待機中*は「待っています」です。あなたのコードはそこに座って何もせず、そのタスクが完了するのを待っています。そして、それは 'OnStart'と呼ばれる同じスレッドで待っています。 –

+0

番号。例外をキャプチャするために使用されます。 –

1

サービスのステータスが「停止中」であることを確認してループを終了する必要があります。 OSがあなたを殺すことを決定する前に、あなたは5秒間それを行う必要があります。

1

これを行う私はあなたが最後にOriginalFileProcessor.StartPolling()を待っているので、これは、あると思いますが、これは起こりません。タスクインスタンスを独立したメンバーに移動し、完了するのを待つ必要はありません。

private Task m_task = null; 

private void DoTask() 
{ 
    try 
    { 
     m_task = Task.Factory.StartNew(() => this.StartPolling()); 
    } 
    catch 
    { 
     this.Log.Error("Unable to start task", ex); 
     throw; // Rethrow, so that the OS knows, there was something wrong. 
    }   
} 

private void StartPolling() 
{ 
    try 
    { 
     this.OriginalFileProcessor.StartPolling(); 
    } 
    catch (Exception ex) 
    { 
     this.Log.Error("Failed running the task", ex); 
    } 
} 
+0

あなたのキャッチは決してキャッチしません。それはあなたがそれを待っているときだけ捕まえることができます。 –

+0

@TheLight:StartPollingからではなく、['Task.Factory.StartNew'](http://msdn.microsoft.com/en-us/library/dd321439.aspx)から例外をキャッチする必要があります。非同期を実行するサービスを開始していますが、完了するのを待つことはありません。答えを更新しました。 – Carsten

+0

Task.Factory.StartNewは例外を返しません。タスクを待つときに例外をキャプチャできます。または他の方法がありますか? –

関連する問題