Продолжение задачи (OnlyOnFaulted) по-прежнему получает незамеченное исключение

У меня есть задача с продолжением для обработки ошибок:

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
var loadTask = Task<List<OrderItemViewModel>>.Factory.StartNew(() =>
{
       throw new Exception("derp");
});

var errorContinue = loadTask.ContinueWith(t =>
    {
        MainViewModel.RemoveViewModel(this);
    }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, uiScheduler);

Продолжение сбивается, но через несколько секунд получаю в приложении такую ​​ошибку:

Исключения задачи не наблюдались ни при ожидании задачи, ни при доступе к ее свойству исключения. В результате ненаблюдаемое исключение было повторно сгенерировано потоком финализатора.

Это связано с uiScheduler? Решение аналогичного вопроса в основном заключается в том, что я делаю the-task-or-accessi">Исключения задачи не наблюдались ни при ожидании задачи, ни при доступе к ее свойству Exception. В результате ненаблюдаемое исключение было


person Chris Klepeis    schedule 08.09.2012    source источник


Ответы (1)


Вам нужно фактически обработать (или хотя бы наблюдать) исключение:

var errorContinue = loadTask.ContinueWith(t =>
{
    // Observe/acknowledge the exception.  
    // You can use t.Wait(), which throws, or just grab the exception
    var exception = t.Exception; 
    MainViewModel.RemoveViewModel(this);
}, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, uiScheduler);

Это связано с этой строкой документации по обработке исключений в TPL:

Если вы не ждете задачу, которая распространяет исключение, или не обращаетесь к ее свойству Exception, исключение эскалируется в соответствии с политикой исключений .NET при сборке мусора.

В вашем случае у вас есть продолжение, но вы никогда не «ждете исключения» или не получаете доступ к его свойству исключения. Причина, по которой мой ответ (в опубликованном вами связанном вопросе) работает, заключается в том, что я фактически использую свойство Exception в задаче, прошедшей через продолжение.

person Reed Copsey    schedule 08.09.2012
comment
Microsoft изменила политику исключений .NET с момента написания этого ответа. Ненаблюдаемые исключения см. на странице msdn.microsoft.com/en-us/library/. hh367887.aspx#core - person Moby Disk; 09.06.2016