public async CTask Do() { Console.WriteLine("TRAVEL AGENT - Workflow Initialized"); var compensatingActions = new CList <Func <CTask> >(); try { var reservationId = await BankConnection.ReserveFunds(1_000, "1234-1234-1234-1234"); compensatingActions.Add(() => BankConnection.CancelReservation(reservationId)); var carBookingId = await AirlineConnection.Book("Mazda 2 Sport"); compensatingActions.Add(() => AirlineConnection.CancelBooking(carBookingId)); var hotelBookingId = await HotelConnection.Book("Hotel Dangleterre Suite"); compensatingActions.Add(() => HotelConnection.CancelBooking(hotelBookingId)); await BankConnection.DeductFunds(reservationId); } catch (Exception) { compensatingActions.ForEach(a => a()); throw; } Console.WriteLine("TRAVEL AGENT - Workflow completed!"); }