【问题标题】:Implement TAP in MVC C# [closed]在 MVC C# 中实现 TAP [关闭]
【发布时间】:2019-08-14 15:46:37
【问题描述】:

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

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

但是对于如何在 MVC C# 中实现 TAP,我们有任何指导方针或具体方法吗?

提前谢谢!!!..

【问题讨论】:

  • 可以启用以获得更好的性能 - 异步对性能没有帮助,但对可用性有帮助。
  • 查看我的回复,这将有助于回答您可能遇到的大多数问题,如果您仍有任何疑问,请回复

标签: c# asp.net-mvc async-await


【解决方案1】:

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

我们先来了解一下,什么是异步编程,就是把处理逻辑放在后台,而主线程继续处理,不会被阻塞,就像同步处理那样阻塞调用线程,有两种异步处理:

  1. IO Async,这是主要用例,它适用于进程范围之外的任何调用,例如对数据库或 Web 服务/Web api 的调用,在这种情况下 基于硬件的并发出现在图片中是因为不再需要软件线程,一旦通过网络调度调用,软件线程可以返回线程池以服务其他请求,从而增加@Fabio 建议的系统可扩展性或可用性。软件线程的作用是调度调用并接收结果,没有任何等待,在大多数情况下非常快
  2. In Memory Async,这不是最常见的用例,但这更多是关于释放 Ui 线程,而可以在后台进行内存中的逻辑处理。它有助于保持界面响应。在这种情况下,Ui 也可以响应,因为数据库调用是异步完成的,因为同步调用总是会阻塞主线程,使系统无响应。

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

并行处理始终在内存中,旨在利用所有计算能力并行处理逻辑元素(最好是互斥的)并最终聚合结果。它旨在利用所有 CPU 处理能力。相比之下,异步处理是在后台处理事情,而不是阻塞主处理线程,内存中的异步,如果 Parallelized 仍然可以使用 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

【讨论】:

    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 2019-04-16
    • 2010-10-24
    • 2013-02-14
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多