Каким образом можно использовать CancellationToken для отмены асинхронных операций в вашем проекте?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
CancellationToken позволяет кооперативно отменять длительные асинхронные операции: запросы к API, чтение файлов, фоновые задачи, обработку очередей. Токен передают в методы, которые умеют его принимать, и проверяют в коде на отмену. При отмене обычно выбрасывается OperationCanceledException, а задача завершается корректно и предсказуемо.
Определение:
CancellationToken в C# — это механизм уведомления о запросе на отмену операции. Он сам по себе не прерывает код принудительно, а дает задаче возможность завершиться безопасно в подходящем месте. Обычно токен создают через CancellationTokenSource, передают в асинхронный метод и внутри проверяют через ThrowIfCancellationRequested() или через поддерживаемые API.
Пример использования:
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2));
try
{
string result = await LoadDataAsync(cts.Token);
Console.WriteLine(result);
}
catch (OperationCanceledException)
{
Console.WriteLine("Операция была отменена.");
}
}
static async Task<string> LoadDataAsync(CancellationToken cancellationToken)
{
using var httpClient = new HttpClient();
cancellationToken.ThrowIfCancellationRequested();
var response = await httpClient.GetAsync("https://example.com", cancellationToken);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync(cancellationToken);
}
}
Пояснение кода:
В этом примере создается CancellationTokenSource с тайм-аутом 2 секунды. Он автоматически запрашивает отмену по истечении времени.
Далее токен передается в LoadDataAsync, а внутри — в асинхронные методы GetAsync и ReadAsStringAsync, которые умеют работать с отменой.
Если отмена произошла до завершения запроса, будет выброшено исключение OperationCanceledException, которое обрабатывается в Main.
Такой подход позволяет не держать ресурсы занятыми дольше нужного и корректно завершать операцию.
Ключевые моменты:
CancellationTokenработает кооперативно: код должен сам его уважать.- Обычно токен создают через
CancellationTokenSourceи передают дальше по цепочке вызовов. - В асинхронных методах токен проверяют вручную или передают в API, которые поддерживают отмену.
- При отмене часто возникает
OperationCanceledException, это нормальный сценарий. - Отмена не означает аварийное завершение: важно освобождать ресурсы и корректно завершать работу.
CancellationTokenполезен для таймаутов, кнопки “Отмена”, остановки фоновых задач и graceful shutdown.