私は時々この問題と戦ってきました。.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 で明示的にクラッシュ動作を有効にする必要があります。