Назад к вопросам
Middle
120
questionbank

Что такое CancellationToken в многопоточности?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

Он состоит из:

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

Пример использования:

// Создаем источник токена
var cts = new CancellationTokenSource();
var token = cts.Token;

// Запускаем задачу, передавая токен
var task = Task.Run(() =>
{
    for (int i = 0; i < 1000; i++)
    {
        // Проверяем, была ли запрошена отмена
        if (token.IsCancellationRequested)
        {
            Console.WriteLine("Отмена запрошена.");
            // Можно дополнительно выбросить исключение
            // token.ThrowIfCancellationRequested();
            break;
        }
        Console.WriteLine($"Выполняется итерация {i}");
        Thread.Sleep(100); // Имитация работы
    }
}, token);

// Ждем некоторое время и запрашиваем отмену
Thread.Sleep(500);
cts.Cancel();

// Ожидаем завершения задачи
task.Wait();

Преимущества использования CancellationToken:

  • Контроль: Позволяет внешнему коду запросить отмену выполняющейся операции.
  • Гибкость: Отменяемая операция сама определяет, как реагировать на запрос отмены (немедленно завершиться, выполнить очистку перед завершением и т.д.).
  • Чистота кода: Предоставляет структурированный механизм отмены вместо ручного управления флагами или другими методами синхронизации.
  • Интеграция: Хорошо интегрируется с асинхронными операциями на основе задач (Task, async/await) и другими библиотеками .NET, поддерживающими отмену.