Читая код одного из разработчиков нашей команды, наткнулся на такие строки:
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteUser([FromRoute] int id)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var user = await _context.Users.SingleOrDefaultAsync(m => m.Id == id);
if (user == null)
{
return NotFound();
}
...
return Ok(user);
}
Вижу такой код не в первые, а именно вызов в контроллере ASP.NET Core Web API асинхронный вариант некого метода (в данном случаи SingleOrDefault)
var user = await _context.Users.SingleOrDefaultAsync(m => m.Id == id);
Зачем это делается, разве все методы контроллера так и так не вызываются в отдельном потоке?
SingleOrDefaultпредпочтительнее чемSingleOrDefaultAsync? Потому что мне теперь кажется, что смысл использованияSingleOrDefaultполностью теряется при существовании варианта Async, разве что для каких-то определенных задач, но вопрос, какие это задачи? – Adam Shakhabov Feb 26 '18 at 20:16SingleOrDefaultлезет в БД. например, для коллекции в памяти нет никакого смысла использовать асинхронный вариант. Также не все БД поддерживаются асинхронную работу (например, насколько я помню, EF (какая то предыдущая версия) для sql compact не поддерживает асинхронные операции) – tym32167 Feb 26 '18 at 20:31Цель как раз не использовать поток в то время, пока ожидается ответ от базы— почему? Поток всё равно простаивает, к тому же это недешёвый по памяти ресурс. Асинхронный вызов функции сохраняет текущий контекст выполнения и выполняет прыжок в обработчик следующего запроса. Как только асинхронная функция завершит работу, поток быстро вернётся к сохранённому контексту и продолжит прерванную работу. – Arhadthedev Feb 27 '18 at 07:57