Sobes.tech
Middle+
36

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

Сұралған компаниялар
OZONOZON

AI-дан жауап

sobes.tech AI

При параллельном выполнении задач через 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() для запуска отмены.

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