我有时候一直在与这个问题作斗争。针对.NET 4.0的Windows服务创建了一个.NET signalr客户端,但由于任务中抛出的聚合异常,有时因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和signalr中的异常时我缺少什么?
注意:在具有.net 4.5的系统上,该服务没有问题 - 没有崩溃 - 因为Microsoft使其成为默认行为。必须在web.config中显式启用崩溃行为。