Как корректно реализовать отмену бронирования при параллельном выполнении задач через Task.WhenAll?

При параллельном выполнении задач через Task.WhenAll для корректной отмены бронирования нужно использовать CancellationToken. Он позволяет координировать отмену всех задач.

Короткий ответ

Что ответить на собеседовании

При параллельном выполнении задач через Task.WhenAll для корректной отмены бронирования нужно использовать CancellationToken. Он позволяет координировать отмену всех задач.

Подробный разбор

Ответ с пояснениями

При параллельном выполнении задач через Task.WhenAll для корректной отмены бронирования нужно использовать CancellationToken. Он позволяет координировать отмену всех задач.

Пример:

public async Task CancelBookingsAsync(List<Booking> bookings, CancellationToken cancellationToken)
{
    var tasks = bookings.Select(async booking =>
    {
        cancellationToken.ThrowIfCancellationRequested();
        await CancelBookingAsync(booking, cancellationToken);
    });

    try
    {
        await Task.WhenAll(tasks);
    }
    catch (OperationCanceledException)
    {
        // Логика обработки отмены
        Console.WriteLine("Отмена операций бронирования выполнена.");
    }
}

public async Task CancelBookingAsync(Booking booking, CancellationToken cancellationToken)
{
    // Имитация отмены бронирования
    await Task.Delay(1000, cancellationToken);
    Console.WriteLine($"Бронирование {booking.Id} отменено");
}

Ключевые моменты:

  • Передайте один и тот же CancellationToken во все задачи.
  • Внутри каждой задачи проверяйте cancellationToken.ThrowIfCancellationRequested() для своевременной отмены.
  • При необходимости вызовите CancellationTokenSource.Cancel() для запуска отмены.

Такой подход гарантирует, что при отмене одна задача прервет выполнение, и остальные задачи тоже смогут корректно завершиться.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее