【问题标题】:What's the benefit of using async to return data from database?使用异步从数据库返回数据有什么好处?
【发布时间】:2013-09-24 20:51:22
【问题描述】:

我已经阅读了很多关于 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);
}

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

【问题讨论】:

  • 很好的问题(Stephen Cleary 给出了很好的回答)...我也这么想!我不明白你为什么要使用这些异步任务,然后调用它们,然后等待回复。

标签: c# asp.net asp.net-web-api async-await


【解决方案1】:

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

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

请注意,不是每个方法都应该是async。当你想await 一些操作时,你应该只使用async。有一个 great Channel9 video 描述了在 ASP.NET 上使用 async 的概念和好处。今年我还在ThatConferenceasync on the server side 上做了一次演讲(链接到我的博客文章,包括幻灯片)。

【讨论】:

  • 但是当服务器等待任务完成时——这个任务正在使用其他线程来执行它的工作。我们不是只是将工作从线程 1 转移到线程 2 吗?
  • @Dmitry:不。我有一篇博文解释了why there isn't a thread being used
猜你喜欢
  • 2014-01-18
  • 2011-04-21
  • 2016-10-02
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 2015-04-21
相关资源
最近更新 更多