Какая польза от использования async для возврата данных из базы данных?

Я много читал в WebApi2, и мне это очень нравится, но я просто не понимаю, почему каждый метод использует async вместо стандартных методов.

Вот пример:

[ResponseType(typeof(BookDto))]
public async Task<IHttpActionResult> GetBook(int id)
{
    BookDto book = await db.Books.Include(b => b.Author)
        .Where(b => b.BookId == id)
        .Select(AsBookDto)
        .FirstOrDefaultAsync();
    if (book == null)
    {
        return NotFound();
    }

    return Ok(book);
}

Какая польза здесь? Мне все равно придется дождаться загрузки моей книги из db с помощью ef перед ее обслуживанием. Это как-то отличается от обычного способа, когда я не использую задачи для извлечения книги?

Ответы

Ответ 1

На стороне сервера (например, WebAPI) методы async позволяют потоку запроса возвращаться к пулу потоков, когда сервер базы данных генерирует ответ. Это позволяет вам лучше масштабироваться.

Когда сервер базы данных возвращает ответ на ваш метод WebAPI (т.е. задача, возвращаемая FirstOrDefaultAsync завершается), ASP.NET будет захватывать другой поток из пула потоков и возобновлять обработку вашего запроса.

Обратите внимание, что не каждый метод должен быть async. Вы должны использовать async, если хотите await выполнить некоторую операцию. Там отличный видео Channel9, который описывает концепции и преимущества использования async на ASP.NET. Я также поговорил в ThatConference в этом году на async on серверная сторона (ссылка на мое сообщение в блоге, включая слайды).