我正在编写一个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
的暂停之间没有处理(因此“单线程”,但是也许不是字面上的。)
我的问题是,从资源的角度来看,这与同步替代方案有何不同?假设它在整个控制器中是异步的,那么服务规模会更好吗?
奖励要点:在异步应用程序中执行某些同步阻塞会产生什么影响(例如,如果开发人员忘记使用异步方法)?
答案 0 :(得分:2)
我建议你阅读我的intro to async on ASP.NET文章,特别是上半部分。
我的问题是,从资源的角度来看,这与同步替代方案有何不同?
同步版本会阻止Web服务器中的线程,直到SQL查询和更新全部完成。当SQL查询和更新正在进行时,异步版本不会占用Web服务器中的线程。线程越少意味着您的Web服务可以更轻松地执行其他操作。
假设它在整个控制器中都是异步的,那么服务规模会更好吗?
您的网络服务?是。您的服务整体?这取决于;具体来说,这取决于你的后端如何扩展。如果它只是一个SQL服务器后端,那么(可能)扩展您的Web服务器没有意义,因为您的SQL服务器将成为您的瓶颈。如果它是SQL集群或Azure SQL,那么(可能)使用async将对整个系统有益。
奖励要点:在异步应用程序中执行某些同步阻止会有什么影响(例如,如果开发人员忘记使用异步方法)?
然后为该操作使用一个线程。例如,如果异步版本使用FirstOrDefaultAsync
和SaveChanges
(不是SaveChangesAsync
),那么线程将在查询期间释放,但在保存期间被阻止。