【问题标题】:Global Uncaught Exception handler for Task.Factory.StartNew tasksTask.Factory.StartNew 任务的全局未捕获异常处理程序
【发布时间】:2016-01-06 12:16:25
【问题描述】:

我在处理应用程序 (WPF) 中的异常时遇到问题。

我经常使用 Tasks,我希望为所有异常(甚至是任务内部)提供一个全局异常处理程序。

我尝试了多个处理程序:

AppDomain.CurrentDomain.UnhandledException
DispatcherUnhandledException 

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

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

TaskScheduler.UnobservedTaskException

但这是在很大延迟后运行的。我认为这是因为 GarbageCollector,所以我找到了一种解决方案(也不起作用)。该解决方案如下所示:

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

您能告诉我应该如何处理这些异常吗?我想避免每次运行任务时都处理它。我更喜欢全局处理程序。

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/19164556/…
  • 我试过这个。答案对我没有帮助,因为a)在这种情况下我不能使用等待/等待(这会从我的调用中删除异步)b)自定义调度程序不起作用
  • 我也遇到了同样的问题你有解决办法吗?

标签: c# wpf


【解决方案1】:

我认为你可以为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();
        }

【讨论】:

  • 这将需要在每次调用 Task.Run 时添加 .Catch 块?有没有办法将它自动​​添加到所有调用中?
猜你喜欢
  • 2018-06-14
  • 2013-10-25
  • 1970-01-01
  • 2011-07-02
  • 2015-01-02
  • 2023-03-30
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
相关资源
最近更新 更多