【问题标题】:Benefits of async for Single-Threaded Application单线程应用程序异步的好处
【发布时间】:2017-06-16 23:50:06
【问题描述】:

我正在编写一个 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 的一些用例不同,在启动等待子任务和来自await 的暂停之间没有进行任何处理(因此“单线程”,尽管可能不是字面意思) .

我的问题是,从资源的角度来看,这与同步替代方案有何不同?假设它通过控制器一直是异步的,服务的扩展性会更好吗?

奖励积分:在其他异步应用程序中执行一些同步阻塞有什么影响(例如,如果开发人员忘记使用异步方法)?

【问题讨论】:

  • “异步”是什么意思?
  • 返回任务而不是结果。 “一直通过控制器”意味着永远不会使用 .Result 或 .Wait() 调用任务

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


【解决方案1】:

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

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

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

假设它通过控制器一直是异步的,服务的扩展性会更好吗?

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

奖励积分:在其他异步应用程序中执行一些同步阻塞有什么影响(例如,如果开发人员忘记使用异步方法)?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2014-07-04
    • 2020-02-19
    • 2013-09-10
    • 1970-01-01
    相关资源
    最近更新 更多