有时我一直在与这个问题作斗争。针对 .NET 4.0 的 Windows 服务创建了一个 .NET 信号器客户端,但有时System.Threading.Tasks.TaskExceptionHolder.Finalize()
由于任务中引发的聚合异常而被杀死。这是设置的要点 - 省略了其他细节。
视窗服务:
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 和信号器中的异常时我缺少什么?
注意:在使用 .net 4.5 的系统上,该服务没有问题 - 没有崩溃 - 因为 Microsoft 将其设为默认行为。必须在 web.config 中明确启用崩溃行为。