Назад к вопросам
OZON
Middle+
8
Как корректно реализовать отмену бронирования при параллельном выполнении задач через Task.WhenAll?
Компании, где спрашивали
Ответ от нейросети
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()для запуска отмены.
Такой подход гарантирует, что при отмене одна задача прервет выполнение, и остальные задачи тоже смогут корректно завершиться.