【发布时间】:2021-03-18 02:39:16
【问题描述】:
我创建了一个带有 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 中很好地等待?
需要明确的是,我没有发现使用同步或异步调用有任何问题。我的早期测试没有负载。我希望我的应用程序可以扩展到大约 100 个并发用户,可能使用云主机。这就是为什么我要做出正确的基本架构决策。
如果重要的话,我的后端在 .NET 5 中无需更改即可运行,但我尚未承诺升级。如果 .NET 5 可以提高我的性能,我会考虑升级。
【问题讨论】:
-
您可以通过使数据库调用异步来提高网络服务器的容量,只要触发它们的控制器操作也是异步的 - 因为它在数据库调用运行时释放了 IIS 工作线程.因此,如果您的服务器已达到或接近容量,那么您可能会立即注意到一些改进,或者至少它释放了容量以供将来扩展。
-
如果你的入口代码是
async,最好使用ADO.NET异步调用,避免同步和异步代码混用。几乎所有 ADO.NET 函数都有异步等效函数。文档中的更多详细信息:docs.microsoft.com/en-us/dotnet/framework/data/adonet/…。性能改进可能会或可能不会立即注意到 - 这取决于您的负载;主要好处是避免在等待数据库调用完成时阻塞 ThreadPool 线程。见blog.stephencleary.com/2013/11/there-is-no-thread.html -
谢谢大家。我花费大量时间使所有数据库访问异步(包括将大量 GetDataAdapter-adapter.Fill 调用转换为 ExecuteReader.ReadAsync 调用),然后我开始担心我在浪费时间。当然,同步调用在等待时不会旋转,是吗?
标签: c# asp.net sql-server async-await sqlclient