Исключение SignalR убивает службу / приложение - System.Threading.Tasks.TaskExceptionHolder.Finalize()
Я боролся с этой проблемой иногда. Служба Windows, нацеленная на.NET 4.0, создает клиент сигнализатора.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 генерирует исключения внутри клиентской инфраструктуры, например OnError-System.TimeoutException
или любые сетевые исключения, служба Windows заканчивается тем, что ее убивают. Я даже пытался справиться с Taskscheduler.UnObservedTaskException
но безрезультатно. Так что, похоже, исключения генерируются в другом потоке и не обрабатываются там. С моей настройкой я должен фиксировать исключения и наблюдать - предотвращать сбои. Чего мне не хватает при обработке исключений в TPL и сигнализаторе?
Примечание. В системах с.net 4.5 у службы нет проблем - нет сбоев - поскольку Microsoft установила поведение по умолчанию. Можно было бы явно включить поведение сбоя в web.config.