2

私は時々この問題と戦ってきました。.NET 4.0 を対象とする Windows サービスは、.NET シグナル クライアントを作成しますがSystem.Threading.Tasks.TaskExceptionHolder.Finalize()、タスク内で集計例外がスローされるために、時々強制終了されます。セットアップの要点は次のとおりです。その他の詳細は省略します。

Windows サービス:

onStart()
{
   try {
         var task1 = new Task(SignalrEnv.WireUp(),TaskCreationOption.LongRunning);
         task1.Wait();
   }
   catch(Exception ex)
   {
      //log the exception
   }
}

SingalrEnv クラス:

public void WireUp(){
   //create hubconnection
   //Create hubproxy

   try 
   {
         var task = Hubconnection.Start();
         task.Wait();
   }
   catch(AggregateException agex)
   {
       //observe the inner exceptions so the service won't crash
   }
   catch(Exception ex)
   {
       //Log the exception
   }
}

ただし、Signalr が Signalr クライアント フレームワーク内OnError-System.TimeoutExceptionまたはネットワーク例外のような例外をスローすると、Windows サービスは強制終了されます。私も取り扱いを試みましたTaskscheduler.UnObservedTaskExceptionが、役に立ちませんでした。したがって、例外は別のスレッドでスローされ、そこで処理されないようです。私のセットアップでは、例外をキャプチャして観察し、クラッシュを防ぐ必要があります。TPL と signalr で例外を処理する際に何が欠けていますか?

注: .net 4.5 を使用するシステムでは、Microsoft がデフォルトの動作にしたため、サービスに問題はありません (クラッシュはありません)。web.config で明示的にクラッシュ動作を有効にする必要があります。

4

0 に答える 0