#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 своей базы данных, вы также могли бы передать маркер отмены и время ожидания. Однако выполнение задачи по передаче токена отмены возможно, но немного расточительно в веб-сервисе, я действительно думаю, что вам нужно переосмыслить свою проблему и ограничения