Task.Factory.StartNew任务的全局未捕获异常处理程序

时间:2016-01-06 12:16:25

标签: c# wpf

我在应用程序(WPF)中处理异常时遇到了麻烦。

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

我尝试过多个处理程序:

AppDomain.CurrentDomain.UnhandledException
DispatcherUnhandledException 

这些适用于在Application中抛出的异常(不在任务中)

对于我尝试使用的任务的例外情况

TaskScheduler.UnobservedTaskException

但这是在经过一段大的延迟之后才开始的。我认为这是因为GarbageCollector,所以我找到了一个解决方案(它也不起作用)。此解决方案如下所示:

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

您能告诉我应该如何处理这些例外情况吗?我希望每次运行任务时都避免处理它。对我来说,首选全局处理程序。

1 个答案:

答案 0 :(得分:0)

我认为你可以为Task编写一个扩展类来处理异常

 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();
        }