Sobes.tech
Middle+

¿Cómo implementar correctamente la cancelación de una reserva cuando se ejecutan tareas en paralelo mediante Task.WhenAll?

sobes.tech AI

Respuesta de la IA

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

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