Что такое CancellationTokenSource и CancellationToken

  • Михаил
  • 8 мин. на прочтение
  • 156
  • 07 Jun 2024
  • 07 Jun 2024

В .NET Core, для выполнения асинхронных операций, широко используется паттерн async/await. Этот паттерн позволяет легко создавать и управлять асинхронным кодом, не блокируя основной поток приложения. Однако, в некоторых ситуациях может возникнуть необходимость отменить асинхронную операцию, например, когда пользователь прервал выполнение операции или когда асинхронная операция больше не нужна. В этот момент на помощь приходят CancellationTokenSource и CancellationToken.  CancellationTokenSource и CancellationToken- это взаимосвязанные компоненты в .NET, которые используются для отмены асинхронных операций.

1. CancellationTokenSource:

  • CancellationTokenSource представляет источник отмены операции.
  • Он используется для создания и управления CancellationToken.
  • С помощью CancellationTokenSource вы можете инициировать отмену одной или нескольких асинхронных операций.
  • Когда вы вызываете метод Cancel() на CancellationTokenSource, все CancellationToken, связанные с этим источником, будут отменены.
     

2. CancellationToken:

  • CancellationToken представляет токен отмены, который используется для отслеживания запроса на отмену операции.
  • Он создается на основе CancellationTokenSource и передается в асинхронные операции, чтобы они могли проверять, была ли запрошена отмена.
  • Асинхронные операции, которые принимают CancellationToken, должны регулярно проверять, был ли этот токен отменен, и если да, то должны безопасно завершить свою работу.
  • CancellationToken может быть использован более чем в одной асинхронной операции.
     

Типичный сценарий использования CancellationTokenSource и CancellationToken:

1. Создайте экземпляр CancellationTokenSource:

  • Это позволит вам инициировать отмену одной или нескольких асинхронных операций.

2. Создайте CancellationToken из CancellationTokenSource:

  • Передайте этот токен в асинхронные операции, которые вы хотите иметь возможность отменять.

3. В асинхронных операциях:

  • Регулярно проверяйте, был ли CancellationToken отменен. 
  • Если токен отменен, безопасно завершите работу асинхронной операции.

4. Когда вы хотите отменить одну или несколько асинхронных операций:

  • Вызовите метод Cancel() на CancellationTokenSource.
  • Это приведет к отмене всех CancellationToken, связанных с этим источником, и позволит асинхронным операциям безопасно завершить свою работу.

Использование CancellationTokenSource и CancellationToken помогает обеспечить отзывчивость и управляемость асинхронных операций в вашем приложении. Это особенно важно в сценариях, где необходимо досрочно прекратить длительные асинхронные операции, например, при отмене пользователем операции или при выключении приложения.

Вот простой пример использования токенов отмены для отмены асинхронной операции:

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
    static async Task Main(string[] args)
    {
        using (var cts = new CancellationTokenSource())
        {
            try
            {
                await DoLongRunningOperationAsync(cts.Token);
            }
            catch (OperationCanceledException)
            {
                Console.WriteLine("Asynchronous operation was canceled.");
            }
        }
    }

    static async Task DoLongRunningOperationAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine("Starting long-running operation...");

        // Simulate a long-running operation
        await Task.Delay(5000, cancellationToken);

        Console.WriteLine("Long-running operation completed.");
    }
}

В этом примере, мы создаем CancellationTokenSource, передаем токен в асинхронный метод DoLongRunningOperationAsync, и затем отменяем операцию, вызывая cts.Cancel(). Это приводит к выбрасыванию OperationCanceledException, которое мы обрабатываем в вызывающем коде. Использование токенов отмены позволяет эффективно управлять жизненным циклом асинхронных операций в .NET Core, обеспечивая гибкость и контроль над ними.

Ссылки на примеры по теме:

Отмена задач и параллельных операций. CancellationToken

Задачи и отмена в .Net — tips & tricks