Назад к вопросам
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, поддерживающими отмену.