单线程应用程序的异步优势

时间:2017-06-16 15:08:44

标签: entity-framework asp.net-web-api async-await

我正在编写一个WebAPI微服务,我想知道使用async是否有好处。该服务通过Entity Framework对SQL数据库进行一些调用。

同步

using(var db = new Entities())
{
    var user = db.Users.FirstOrDefault();
    user.IsActive = false;
    db.SaveChanges();
}

异步:

using(var db = new Entities())
{
    var user = await db.Users.FirstOrDefaultAsync();
    user.IsActive = false;
    await db.SaveChangesAsync();
}

与我见过的async的一些用例不同,在开始等待的子任务和来自await的暂停之间没有处理(因此“单线程”,但是也许不是字面上的。)

我的问题是,从资源的角度来看,这与同步替代方案有何不同?假设它在整个控制器中是异步的,那么服务规模会更好吗?

奖励要点:在异步应用程序中执行某些同步阻塞会产生什么影响(例如,如果开发人员忘记使用异步方法)?

1 个答案:

答案 0 :(得分:2)

我建议你阅读我的intro to async on ASP.NET文章,特别是上半部分。

  

我的问题是,从资源的角度来看,这与同步替代方案有何不同?

同步版本会阻止Web服务器中的线程,直到SQL查询和更新全部完成。当SQL查询和更新正在进行时,异步版本不会占用Web服务器中的线程。线程越少意味着您的Web服务可以更轻松地执行其他操作。

  

假设它在整个控制器中都是异步的,那么服务规模会更好吗?

您的网络服务?是。您的服务整体?这取决于;具体来说,这取决于你的后端如何扩展。如果它只是一个SQL服务器后端,那么(可能)扩展您的Web服务器没有意义,因为您的SQL服务器将成为您的瓶颈。如果它是SQL集群或Azure SQL,那么(可能)使用async将对整个系统有益。

  

奖励要点:在异步应用程序中执行某些同步阻止会有什么影响(例如,如果开发人员忘记使用异步方法)?

然后为该操作使用一个线程。例如,如果异步版本使用FirstOrDefaultAsyncSaveChanges(不是SaveChangesAsync),那么线程将在查询期间释放,但在保存期间被阻止。