C# 使用异步从数据库返回数据有什么好处?

C# 使用异步从数据库返回数据有什么好处?,c#,asp.net,asp.net-web-api,async-await,C#,Asp.net,Asp.net Web Api,Async Await,我在WebApi2上读了很多书,我真的很喜欢它,但是我不明白为什么每个方法都使用异步而不是标准方法 以下是一个例子: [ResponseType(typeof(BookDto))] public async Task<IHttpActionResult> GetBook(int id) { BookDto book = await db.Books.Include(b => b.Author) .Where(b => b.BookId == id)

我在WebApi2上读了很多书,我真的很喜欢它,但是我不明白为什么每个方法都使用异步而不是标准方法

以下是一个例子:

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

这里有什么好处?我仍然需要等待使用ef从db加载我的书,然后再提供它。这与我不使用任务检索图书的常规方式有什么不同吗?

在服务器端,例如WebAPI,异步方法允许请求线程在数据库服务器生成响应时返回线程池。这允许您更好地扩展

当数据库服务器返回对WebAPI方法的响应(即FirstOrDefaultAsync返回的任务完成)时,ASP.NET将从线程池中获取另一个线程并继续处理您的请求


请注意,并非每个方法都应该是异步的。仅当您希望等待某些操作时,才应使用async。有一个例子描述了在ASP.NET上使用异步的概念和好处。今年我还做了一个关于我的博客文章链接(包括幻灯片)的演讲。

但当服务器等待任务完成时,这个任务正在使用其他线程执行它的工作。我们不是刚把工作从线程1转移到线程2吗?@Dmitry:不是。我有一篇解释的博客文章。Stephen Cleary提出了一个很好的问题和一个很好的答案。。。我也这么想!我不明白为什么要将这些任务与async一起使用,然后调用它们,然后等待答复。