2016-01-06 106 views
1

我在处理应用程序(WPF)中的异常时遇到麻烦。Task.Factory.Start的全局未捕获异常处理程序新任务

我使用任务很多,我想有一个全局异常处理程序的所有异常(甚至内部任务)。

我已经尝试了多个处理程序:

AppDomain.CurrentDomain.UnhandledException 
DispatcherUnhandledException 

这些作品以及在应用程序(而不是任务中)

对于从任务异常抛出的异常我试图用

TaskScheduler.UnobservedTaskException 

但是这是在经过很长时间后才开始的。我认为这是因为GarbageCollector,所以我找到了一个解决方案(这不起作用)。此解决方案如下所示:

.ContinueWith(c => 
     { 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      GC.Collect(); 
     },TaskContinuationOptions.OnlyOnFaulted); 

请问我该如何处理这些异常?我想避免每次运行任务时处理它。全球处理程序是我的首选。

+0

这可能帮助:HTTP://计算器。 com/questions/19164556/how-to-catch-observe-an-unhandled-exception-thrown-a-task – null1941

+0

我试过这个。答案对我没有帮助,因为a)在这种情况下,我无法使用wait/await(这会消除我的调用中的异步)b)自定义调度程序不起作用 – Tomasz

回答

0

我想你可以写任务扩展类处理异常

public static class ExtensionClass 
    { 
     public static void Catch<TException>(this Task task, Action<TException> exceptionHandler, 
            TaskScheduler scheduler = null) where TException : Exception 
     { 
      if (exceptionHandler == null) 
       throw new ArgumentNullException("exceptionHandler cannot be null"); 

     } 
    } 

,你可以写所有Task.Run这样

private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 

      Task.Run((Action)TryExecute).Catch<Exception>((r) => Console.WriteLine("Caught Exception {0}", r)); 
     } 

     private static void TryExecute() 
     { 
      throw new NotImplementedException(); 
     } 
+0

这需要将.Catch <>块添加到每次调用Task.Run?有没有办法将它自动​​添加到所有调用? – Tomasz