Подтвердить что ты не робот

Задачи на С# - Почему в этом случае нужна нуль-линия

Я читаю исходный код Interactive Extensions и нашел строку которую я не могу понять:

public static Task<bool> UsingEnumerator(this Task<bool> task, IDisposable disposable)
{
    task.ContinueWith(t =>
    {
        if (t.IsFaulted)
        {
            var ignored = t.Exception; // don't remove!
        }

        if (t.IsFaulted || t.IsCanceled || !t.Result)
            disposable.Dispose();
    }, TaskContinuationOptions.ExecuteSynchronously);

    return task;
}

Я также не вижу соответствующих комментариев в документах для свойств IsFaulted или Exception.

Почему эта строка var ignored = t.Exception; // don't remove! нужна в этом контексте?

Связанный с этим вопрос: я думал, что такие строки оптимизированы в режиме Release, но, учитывая комментарии и намерения здесь, это не так (если код верен). Итак, почему эта строка остается в режиме Release?

4b9b3361

Ответ 1

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

В .Net 4.0 задача с незаметным исключением вызовет UnobservedTaskException и отменит все приложение:

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

От Обработка исключений (параллельная библиотека задач)

Это было изменено в .Net 4.5 с помощью async-await, хотя вы можете вернуть прежнее поведение с помощью app.config(<ThrowUnobservedTaskExceptions enabled="true"/>).

Также существует событие (TaskScheduler.UnobservedTaskException), которое позволяет обрабатывать такие сбои перед сбоем приложения. Это событие все еще поднимается в .Net 4.5 и выше.