Асинхронность и тайм-ауты в webapi (.NET)

#c# #.net #multithreading #asynchronous #webapi

Вопрос:

У меня есть следующий маршрут в моем контроллере .NET WebAPI :

 [HttpPost] [Route("insert")] public async Tasklt;IActionResultgt; Insert(Customer customer) {  customer.InsertUser = string.IsNullOrWhiteSpace(_currentUserService.UserId) ? "api" : _currentUserService.UserId;   try  {  using (CustomerBC customerBC = new())  {  var task = Task.Run(() =gt; customerBC.NewItem(customer));  await task;  }  return Ok(await Resultlt;Customergt;.SuccessAsync(customer));  }  catch(Exception ex)  {  Listlt;stringgt; messages = new()  {  string.Format("Error: {0},Source : {1}", ex.Message, ex.Source)  };  return Ok(Resultlt;Customergt;.FailAsync(messages));  } }  

У меня нет доступа для изменения кода базы данных, и он не предназначен для получения ожидаемых результатов. Итак, я решил сделать a Task.Run в своем контроллере.

Теперь возникают два вопроса :

1). Что происходит, когда у меня вообще нет подключения к моей базе данных ? Прямо сейчас кажется, что, когда я звоню, он просто долго остается в ожидании ответа. Могу ли я добавить тайм-аут в свой контроллер ? Допустим, я хочу подождать 60 секунд, а после этого выдать исключение или что-то в этом роде ?

2). Что произойдет, если пользователь захочет «Отменить» запрос ? Как я могу реализовать CancellationToken это в данном случае ? Все примеры, которые я нашел, относятся к дальнейшей передаче токена другим сущностям, таким как EntityFramework. Но как я могу сделать это в своем сценарии?

Комментарии:

1. Какую выгоду вы ожидаете от использования Task.Run здесь?

2. Потребители этой конечной точки отвечают за асинхронное ожидание, чтобы избежать блокировки. Также при такой реализации нет ненужного переключения потоков.

3. У БД есть свой собственный тайм-аут, тот факт, что ваш веб-wpi не может достичь вашей базы данных, является более фундаментальной проблемой, над которой вам следует поработать в первую очередь

4. @The General У меня нет этой проблемы. Я просто хочу смоделировать, что происходит, когда вообще нет подключения, и как я могу сообщить об этом пользовательскому интерфейсу.

5. Если бы вы использовали собственные вызовы asnc своей базы данных, вы также могли бы передать маркер отмены и время ожидания. Однако выполнение задачи по передаче токена отмены возможно, но немного расточительно в веб-сервисе, я действительно думаю, что вам нужно переосмыслить свою проблему и ограничения