Как мне обработать асинхронное исключение этого приложения Metro?

У меня возникли проблемы с исключением, которое я получаю от некоторого асинхронного кода. Я не хочу блокировать свою тему, пока

private async Task ThrowSomeExceptionAsync()
{
    //Some long running process would go here...

    throw new Exception();
}

Это метод, который я хочу вызвать и поймать исключение. Я использую Application.UnhandledException для перехвата моих исключений, но в данном случае оно не перехватывается.

Я попытался дождаться заполнения свойства Exception в возвращаемом объекте Task, но оно блокируется, пока задача выполняется.

Использование метода ContinueWith предотвратило блокировку, но любые исключения, созданные делегатом, не были перехвачены событием UndhandledException.

Как выполнить этот код асинхронно, но при этом использовать событие UnhandledException для обработки ошибок? Я упускаю какое-то фундаментальное понятие об этом событии?


person CamronBute    schedule 12.09.2012    source источник


Ответы (1)


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

person CamronBute    schedule 12.09.2012
comment
Вместо того, чтобы использовать что-то конкретное для XAML, вы также можете проверить версия события вне AppDomain вместо этого. - person James Manning; 13.09.2012
comment
А в случае сбойных задач и отсутствия исключения вы можете использовать статическое событие от TaskScheduler. - person James Manning; 13.09.2012
comment
AppDomain недоступен в приложениях Metro, но статический метод TaskScheduler, с которым вы связались, работает как шарм! Спасибо за совет :) - person CamronBute; 13.09.2012