Sobes.tech
Назад к вопросам
Junior — Middle
58

Каким образом можно использовать 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.