Возможно ли отловить неожиданные ошибки глобально в c # WPF apllication - c # 4.0 - PullRequest
0 голосов
/ 22 октября 2011

Возможно ли глобальное обнаружение непредвиденных ошибок в приложении c # WPF - c # 4.0

Я обнаружил, что DispatcherUnhandledException смог отловить ошибки потока пользовательского интерфейса, но на самом деле мне нужны потоки TPL. UnhandledException удалось отловить ошибки потока, но это все еще приводило к завершению работы программного обеспечения.

Таким образом, любое решение для перехвата необработанных исключений в потоках, не входящих в поток пользовательского интерфейса, и при этом позволяющее программному обеспечению работать не прекращается. Темы - это TPL темы. (Задача параллельной библиотеки)

Ответы [ 2 ]

1 голос
/ 22 октября 2011

Вы можете использовать Custom Escalation Policy в TPL для решения вашего дела. Вы делаете это, добавляя обработчик событий к статическому System.Threading.Tasks.TaskScheduler.UnobservedTaskException члену

    class Test
    {
        static void Main(string[] args)
        {
            // create the new escalation policy
            TaskScheduler.UnobservedTaskException += (object sender, UnobservedTaskExceptionEventArgs eventArgs) =>
             {
                // mark the exception as being handled
                eventArgs.SetObserved();
                // get the aggregate exception and process the contents
                 ((AggregateException)eventArgs.Exception).Handle(ex =>
                    {
                        // write the type of the exception to the console
                         Console.WriteLine("Exception type: {0}", ex.GetType());
                        return true;
                    });
              };
            // create tasks that will throw an exception
            Task task1 = new Task(() =>
            {
                throw new NullReferenceException();
            });
            Task task2 = new Task(() =>
            {
                throw new ArgumentOutOfRangeException();
            });
            // start the tasks
            task1.Start(); task2.Start();
            // wait for the tasks to complete - but do so
            // without calling any of the trigger members
            // so that the exceptions remain unhandled
            while (!task1.IsCompleted || !task2.IsCompleted)
            {
                Thread.Sleep(500);
            }
            // wait for input before exiting
            Console.WriteLine("Press enter to finish and finalize tasks");
            Console.ReadLine();
        }
    }
}
1 голос
/ 22 октября 2011

Часть обработки DispatcherUnhandledException, которую вы уже сделали, добавит это в ваш файл конфигурации

<configuration>
  <runtime>  
    <legacyUnhandledExceptionPolicy enabled="1"/>
  </runtime>
</configuration>

Это предотвратит исключение приложения вторичными потоками из-за закрытия приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...