为了账号安全,请及时绑定邮箱和手机立即绑定

在 MVC C# 中实现 TAP

在 MVC C# 中实现 TAP

C#
慕妹3242003 2023-08-27 16:03:14
很抱歉提出一个一般性问题,但我想要关于代码中可以启用 TAP(任务异步编程)以获得更好性能的功能/区域的建议。我还使用 Web API,其中可以使用 async-await 从数据库检索数据并执行 CRUD 操作。但是我们有关于如何在 MVC C# 中实现 TAP 的任何指南或具体方法吗?提前致谢!!!..
查看完整描述

1 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

很抱歉提出一个一般性问题,但我想要关于代码中可以启用 TAP(任务异步编程)以获得更好性能的功能/区域的建议。

首先我们来了解一下,什么是异步编程,它只是意味着在后台处理逻辑,而主线程处理继续进行,而不会像同步处理那样阻塞调用线程,有两种异步处理:

  1. IO Async,这是主要用例,它适用于进程范围之外的任何调用,例如对数据库或 Web 服务/Web API 的调用,在本例中是基于硬件的并发由于不再需要软件线程,一旦通过网络分派调用,软件线程就可以返回到线程池来服务其他请求,从而提高系统的可扩展性或可用性,如 @Fabio 所建议的。软件线程的作用是分派调用并接收结果,没有任何等待,在大多数情况下,假设没有内存逻辑,这非常快 < 1 毫秒。想象一下,池中只有 25 个线程用于同步调用,最多可以服务 50-100 个请求,因为等待管道会因长时间运行的请求(几秒钟)而膨胀,但对于异步处理,可以分派 1000 个请求,因为它们是通过网络分派进行处理的,所以实际上没有等待线程池线程分派

  2. In Memory Async,这不是最常见的用例,但这更多的是关于释放 Ui 线程,同时可以在后台进行逻辑内存处理。它有助于保持界面的响应能力。在这种情况下,Ui 也可以响应,因为数据库调用是异步完成的,因为同步调用总是会阻塞主线程,从而使系统无响应。

异步处理和并行处理有什么区别?

并行处理始终在内存中,旨在利用所有计算能力并行处理逻辑元素(最好是互斥的)并最终聚合结果。它旨在利用所有 CPU 处理能力。相比之下,异步处理是在后台进行处理,而不是阻塞主处理线程,内存中的异步处理,如果并行化可能仍然使用 CPU 核心,但否则它不会使 CPU 核心激增。

我还使用 Web API,其中可以使用 async-await 从数据库检索数据并执行 CRUD 操作。

Web API通常托管在IIS等Web服务器上,该服务器具有有限的线程池,并且CRUD操作是应用程序边界之外的DB调用。如上所述,这是使用异步调用并提高系统可扩展性的理想情况。

设计原则:

可以列出一些主要细节:

  1. 在C#中async方法需要以运算符为await前缀

  2. 从入口到出口的完整链需要启用Async-Await,如果我们错过了中间的任何地方,那么调用将变成非异步/阻塞,因为只有当通过网络进行 IO 调用分派并且任何其他线程接管时,实际线程才会被释放对于内存中的调用。启用 MVC 和 WebAPI 等框架使控制器(入口点)默认异步

  3. 对于线程池线程可以用来ConfigureAwait(false)指示任何池线程接收结果,它不需要进入相同的同步上下文,这是默认的,除了 Ui 线程,它不能被任何其他线程替换(因为它的特殊性和只能渲染控件)。

结论

相同的原则Async适用于所有框架,MVC,WebAPI,WCF,因为同一个框架可以同时进行AsyncSync调用,异步调用的行为更像是一个切面(横切),其中线程可以被引导到同步模式(阻塞)或异步模式(非阻塞),从而增加系统Scalability / Availability


查看完整回答
反对 回复 2023-08-27
  • 1 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信