【问题标题】:Async classes called with await only, does it make sense?仅使用 await 调用的异步类,有意义吗?
【发布时间】:2018-04-11 10:29:09
【问题描述】:

我被分配到一个已经在运行的新项目。我注意到人们使用async 方法创建了所有存储库类,并且每次都使用await 在控制器中调用它们,因此它们本质上是作为同步代码工作的。

将来它们不可能被异步调用,并且服务器只有一个 SQL Server 实例正在运行。

它来自一种种子 API 项目,创建它的人已不在公司,现在没有人确切知道他们为什么是 async。但我认为在当前的项目场景中,将它们设为async 根本没有意义,它只是给系统增加了不必要的复杂性。

在这种情况下将它们设为async 是否有意义?

【问题讨论】:

  • 我要说的一件事是,如果在任何阶段都可能需要异步,那么最好从一开始就以这种方式进行。我曾参与过一些需要异步处理的项目,而这些项目还没有进行异步处理,而且流动效果让我很头疼。
  • 我不明白你的问题。当您使用 create 这个词时,我认为 new 和 C# 不允许构造函数是异步的,这是有充分理由的。此外,无论 SQL 是否在同一个盒子上,Async 在使用异步 sql 调用时很可能会提高性能。
  • @jmcilhinney 我同意你的观点,如果将来有可能发生异步,那也没关系。但这里不是这样。
  • 等待 async 方法与简单地调用同步方法不同,因为它仍然允许 UI 在执行耗时的工作时保持响应。不过,这仅与本地应用程序真正相关,与 Web 应用程序无关。我不声称自己是权威,但在您的特定情况下,我不知道使用 async/await 的优势。
  • 我觉得这个问题可以帮助你更好地理解async/await:stackoverflow.com/questions/32482275/…

标签: c# asp.net-core


【解决方案1】:

您将“同步”与“串行”混淆了。同步的意思是“阻塞一个线程”; serial 的意思是“一次一个”。

它们每次都在控制器中通过 await 调用,因此它们本质上是作为同步代码工作的。

不,它们是异步和串行调用的。此处的关键是在检索数据时不会阻塞 ASP.NET 请求线程。这个helps your web server scale

服务器有一个 SQL Server 实例正在运行。

根据我对该架构的经验,大多数情况下,单个 SQL 服务器实例将成为您的可扩展性瓶颈。所以在这种情况下,async 不会有任何帮助,因为您的 Web 服务器现在可以扩展,但它仍然会受到数据库后端的限制(同样,在 大多数情况下)。

至于你没有问的问题(“让它们全部同步是否有意义?”),我会说不。为什么故意降低 Web 服务器的可扩展性,即使可以?如果您将来有可能迁移到可扩展的后端(例如 Azure SQL 或 SQL Server 集群),那么您将需要 Web 服务器的可扩展性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2014-02-09
    • 1970-01-01
    • 2020-08-13
    相关资源
    最近更新 更多