2016-10-30 2 views
1

Я следующий кодКак добавить продолжение для отмененных задач

try 
{ 
    var cancellationTokenSource = new CancellationTokenSource(); 
    var token = cancellationTokenSource.Token; 

    var task = Task.Run(() => 
    { 
     while (token.IsCancellationRequested == false) 
     { 
      Console.Write("*"); 
      Thread.Sleep(1000); 
     } 
    }, token).ContinueWith((t) => 
    {     
     Console.WriteLine("You have canceled the task"); 
    }, TaskContinuationOptions.OnlyOnCanceled); 

    Console.WriteLine("Press enter to stop the task"); 
    Console.ReadLine(); 
    cancellationTokenSource.Cancel(); 
    task.Wait(); 
} 
catch (AggregateException e) 
{ 
    Console.WriteLine($"Got an exception => {e.InnerExceptions[0].Message}"); 
} 

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

Но когда я удаляю TaskContinuationOptions.OnlyOnCanceled из continueWith, то задача продолжения выполняется.

Книга, в которой я следую, имеет код с параметром TaskContinuationOptions.OnlyOnCanceled.

Правильное ли поведение или что здесь не так?

Я новичок в нарезке. Пожалуйста, помогите мне.

ответ

3

Ваша первая задача на самом деле не отменяется - вы наблюдаете, что была запрошена аннулирование, но затем вы разрешаете первую задачу выполнить нормально ... что означает, что ваша задача «только на отмену» отменяется. Если вы измените свой код на:

while (token.IsCancellationRequested == false) 
{ 
    Console.Write("*"); 
    Thread.Sleep(1000); 
} 
token.ThrowIfCancellationRequested(); 

... тогда он будет вести себя так, как вы ожидали.

+0

Да совершенный !! он отлично работает. Я скоро приму ответ, потому что он сказал мне, что я буду делать через 7 минут. Спасибо !!! – shanmugharaj

+0

@shansfk: Вы понимаете, почему вам это нужно? Дайте мне знать, если это непонятно - понимающая часть важнее, чем изменение кода :) –

+0

Jon, пожалуйста, объясните. Я еще не мог понять причину. Благодарю. – shanmugharaj

Смежные вопросы