2

有时我一直在与这个问题作斗争。针对 .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 中明确启用崩溃行为。

4

0 回答 0