Looking for .net Keywords? Try Ask4Keywords

.NET Framework Задача: отменить с помощью CancellationToken


пример

var cancellationTokenSource = new CancellationTokenSource();
var cancellationToken = cancellationTokenSource.Token;

var task = new Task((state) =>
    {
        int i = 1;
        var myCancellationToken = (CancellationToken)state;
        while(true)
        {
            Console.Write("{0} ", i++);
            Thread.Sleep(1000);
            myCancellationToken.ThrowIfCancellationRequested();
        }
    },
    cancellationToken: cancellationToken,
    state: cancellationToken);

Console.WriteLine("Counting to infinity. Press any key to cancel!");
task.Start();
Console.ReadKey();

cancellationTokenSource.Cancel();
try
{
    task.Wait();
}
catch(AggregateException ex)
{
    ex.Handle(inner => inner is OperationCanceledException);
}

Console.WriteLine($"{Environment.NewLine}You have cancelled! Task status is: {task.Status}");
//Canceled

В качестве альтернативы ThrowIfCancellationRequested запрос аннулирования может быть обнаружен с помощью IsCancellationRequested а OperationCanceledException может быть IsCancellationRequested вручную:

//New task delegate
int i = 1;
var myCancellationToken = (CancellationToken)state;
while(!myCancellationToken.IsCancellationRequested)
{
    Console.Write("{0} ", i++);
    Thread.Sleep(1000);
}
Console.WriteLine($"{Environment.NewLine}Ouch, I have been cancelled!!");
throw new OperationCanceledException(myCancellationToken);

Обратите внимание, как маркер отмены передается конструктору задачи в параметре cancellationToken . Это необходимо для того , что задача переходит в Canceled состоянии, а не в Faulted состояния, когда ThrowIfCancellationRequested вызываются. Кроме того, по той же причине маркер отмены явно указывается в конструкторе OperationCanceledException во втором случае.