Пытаюсь понять C # TaskContinuationOptions.OnlyOnFaulted

#c#

#c#

Вопрос:

Я пытаюсь понять C # TaskContinuationOptions.OnlyOnFaulted и я написал этот простой пример. Я ожидаю, что задача продолжения не будет выполняться, потому что в предыдущей задаче не было исключения, но она все равно выполняется.

 var task = Task.Factory
    .StartNew(() => { Console.WriteLine("Hello world!"); })
    .ContinueWith((x, y) =>
    {
        Console.WriteLine("This should not get printed!");
    }, TaskContinuationOptions.OnlyOnFaulted);
  

Ответ №1:

Вам нужно более внимательно посмотреть, для каких перегрузок существуют ContinueWith() , и особенно, какую перегрузку вы на самом деле вызываете.

Нет перегрузки для ContinueWith() , которая принимает только делегат и TaskContinuationOptions конкретное значение. Вызываемая вами перегрузка принимает в качестве параметров Action<Task, object> , а затем любое object значение, которое является значением «состояния», переданным Action<Task, object> . Это значение состояния не оказывает никакого влияния на то, что ContinueWith() на самом деле делает. Он просто передает это значение вашему делегату.

Если вы хотите использовать TaskContinuationOptions.OnlyOnFaulted значение для фактического управления поведением ContinueWith() метода, вам нужно использовать перегрузку, которая конкретно включает этот тип параметра.

Самый простой способ исправить ваш код — просто передать null в качестве значения состояния для ContinueWith(Action<Task, object>, object, TaskContinuationOptions) перегрузки:

 var task = Task.Factory
    .StartNew(() => { Console.WriteLine("Hello world!"); })
    .ContinueWith((x, y) =>
    {
        Console.WriteLine("This should not get printed!");
    }, null, TaskContinuationOptions.OnlyOnFaulted);
  

Обратите внимание, что в этом случае ваш task объект будет отменен после завершения первой задачи, а не выполнения продолжения (по замыслу, конечно).