попытка реализовать асинхронные методы в моих классах репозитория
Лучший способ сделать вещи асинхронными - это не "извне".То есть вы не хотите начинать с действия контроллера и говорить «как я могу сделать это асинхронным?».Вместо этого вы хотите начать с API самого низкого уровня и сказать «это должно быть асинхронно» (т. Е. Оно основано на вводе / выводе) и позволить оттуда расти асинхронности.
Если Add
на самом делевставляет ли база данных, тогда это будет первый метод, который будет сделан асинхронным.Затем вы await
ваш AddAsync
метод, и асинхронность возрастает с AddAsync
до CreateBookingAsync
:
public async Task<Booking> CreateBookingAsync(Booking inBooking) {
Booking booking = new Booking();
...
await AddAsync(booking);
return booking;
}
[Route("api/PostBooking")]
[HttpPost]
public async Task<IHttpActionResult> PostBooking(BookingSystemServiceBookingViewModel inBooking)
{
...
uw.Services.AddBooking(await uw.Bookings.CreateBookingAsync(booking), inBooking.service.ServiceId);
uw.Complete();
return Ok();
}
Если, с другой стороны, это метод Complete
, который фактически взаимодействуетс базой данных, то , что - это то, что должно быть сделано асинхронным.В этом случае Add
- это просто операция в памяти, а Complete
- это та, которая сохраняет все обновления базы данных.Итак, после вы конвертируете Complete
в CompleteAsync
, ваш код будет выглядеть так:
public Booking CreateBooking(Booking inBooking) {
Booking booking = new Booking();
...
Add(booking);
return booking;
}
[Route("api/PostBooking")]
[HttpPost]
public async Task<IHttpActionResult> PostBooking(BookingSystemServiceBookingViewModel inBooking)
{
...
uw.Services.AddBooking(uw.Bookings.CreateBooking(booking), inBooking.service.ServiceId);
await uw.CompleteAsync();
return Ok();
}