在 ASP.Net Core 3.1 中等待 SqlClient 调用的最佳方式

Best way to wait for SqlClient calls in ASP.Net Core 3.1

我创建了一个具有 Angular 前端和 ASP.Net Core 3.1 后端的 SPA 应用程序。我使用典型的 RESTful API 在两者之间进行通信,并使用基于 SignalR 的 WebSocket API 进行一些实时推送状态更新。因为此应用程序是对旧 Windows .NET 程序的重写,所以我有大量使用 SqlClient 与公共数据库交互的代码库。我想重用这段代码,而不是尝试将系统转换为 EF。我已经完成了所有这些工作,但我开始担心调用 ExecuteScalar、ExecuteReader 和 ExecuteNonQuery 等函数可能会对 IIS 中 ASP.Net 后端 运行 的性能产生负面影响。我还需要考虑 GetDataAdapter 和 adapter.Fill 但那是另一个问题。

看来我应该使用异步调用来帮助线程管理,但是如果我所做的只是立即等待调用,那么与使用同步调用有什么区别吗?同步调用在 IIS 中等待得很好吗?

明确地说,我没有发现使用同步或异步调用有任何问题。我的早期测试没有负载。我希望我的应用程序可以扩展到大约一百个并发用户,也许使用云主机。这就是为什么我想做出正确的基本架构决策。

如果重要的话,我的后端在 .NET 5 中运行时没有任何变化,但我还没有承诺升级。如果 .NET 5 可以提高我的性能,我会考虑升级。

but if all I do is immediately Await the call is there any difference to using the synchronous calls?

是的,有一个非常显着的区别:它释放线程,这样线程就不会被网络 IO(以及数据库服务器正在做的任何事情)阻塞,而是可以去做其他有趣的事情。 Await 是关于 CPU 资源(特别是:线程)的可伸缩性的,但是有一些小的开销可以使 individual 请求稍微慢一些,但不会慢多少你曾经测量过。

但对于上下文:Stack Overflow(它的负载比这高得多)在 IIS 上很好地扩展(它也在 Kestrel 中运行 所需的)使用主要 同步数据库访问(到异步数据访问的转换仍在进行中)。如果您的应用程序不能扩展到 100 个用户,将责任归咎于同步与异步将推卸责任:真正的问题可能是由于次优设计导致的查询性能不佳。异步不会成为成就或破坏它的东西 - 它只会帮助设计良好的系统进一步扩展。