2017-06-16 14 views
0

我正在写一个WebAPI微服务,并且想知道是否有利于使用async。该服务通过实体框架调用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我已经看到了一些用例,没有拉开awaitable子任务与促成的处理暂停来自await(因此“单线程”,但可能不是字面上)。

我的问题是,从资源的角度来看,这与同步替代方案有什么不同?假设它在控制器中始终是异步的,服务是否会更好地扩展?

奖励要点:在其他异步应用程序(如开发人员忘记利用异步方法)中进行一些同步阻塞的含义是什么?

+0

“asynchrounous”是什么意思? –

+0

返回任务而不是结果。 “一路通过控制器”意味着一个任务不会被调用.Result或.Wait() –

回答

2

我建议你阅读我的intro to async on ASP.NET文章,尤其是上半场。

我的问题是,从资源的角度来看,这是如何真正不同于同步替代?

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

假设它一直通过控制器异步,服务规模会更好吗?

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

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

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

相关问题