1

Читая код одного из разработчиков нашей команды, наткнулся на такие строки:

[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);

Зачем это делается, разве все методы контроллера так и так не вызываются в отдельном потоке?

  • 3
    https://ru.stackoverflow.com/a/491783/196257 – Monk Feb 26 '18 at 16:43
  • 3
    Вы путаете асинхронность и многопоточность. Синхронный вариант блокирует поток. Асинхронный поток не блокирует. Потому асинхронный предпочтительней - так как пока сервер ждет ответа от БД, он может переиспользовать поток для других запросов в асинхронном случае. – tym32167 Feb 26 '18 at 16:46
  • Цель как раз не использовать поток в то время, пока ожидается ответ от базы – Primus Singularis Feb 26 '18 at 16:50
  • @tym32167, теперь встает другой вопрос: в каких случаях SingleOrDefault предпочтительнее чем SingleOrDefaultAsync? Потому что мне теперь кажется, что смысл использования SingleOrDefault полностью теряется при существовании варианта Async, разве что для каких-то определенных задач, но вопрос, какие это задачи? – Adam Shakhabov Feb 26 '18 at 20:16
  • не всякий SingleOrDefault лезет в БД. например, для коллекции в памяти нет никакого смысла использовать асинхронный вариант. Также не все БД поддерживаются асинхронную работу (например, насколько я помню, EF (какая то предыдущая версия) для sql compact не поддерживает асинхронные операции) – tym32167 Feb 26 '18 at 20:31
  • Цель как раз не использовать поток в то время, пока ожидается ответ от базы — почему? Поток всё равно простаивает, к тому же это недешёвый по памяти ресурс. Асинхронный вызов функции сохраняет текущий контекст выполнения и выполняет прыжок в обработчик следующего запроса. Как только асинхронная функция завершит работу, поток быстро вернётся к сохранённому контексту и продолжит прерванную работу. – Arhadthedev Feb 27 '18 at 07:57

0 Answers0