MVC:异步Action:实现 / 性能分析

更多
2021年01月03日 21点43分 作者:叶飞 修改

Async报错

比如我们试图在MVC项目中调用异步的方法:(复习

    client.SendAsync(mail, "success");
    client.SendMailAsync(mail);

就会收到这样一个错误消息:

现在无法开始异步操作。异步操作只能在异步处理程序或模块中开始……该异步方法应该返回一个任务,而调用方应该等待该任务。为什么呢?

我们知道:IIS本身是多线程(复习)的,且一个线程对应(处理)一个Request请求,请求处理完毕发送response到客户端,over,线程回收。

如果我们直接引入异步方法,就很有可能:

  • 响应request的同步方法已经执行完毕,将response返回给客户端,而异步方法还没有执行完毕
  • 等异步方法执行完毕,已经无法影响response了
这……ʅ(‾◡◝)ʃ


异步Action

要使用异步方法,需要将Action方法改为异步方法,如下:

        public async Task<ActionResult> Index()
        {
            //……await之前其他代码:准备message/client等
            await client.SendMailAsync(mail);
            //……await之后其他代码
            return View();
        }
这样,await会确保异步方法执行完成之后才继续执行后续代码,生成ActionResult等。


在MVC3以及之前,还需要Controller继承AsyncController

    public class RegisterController : AsyncController



性能优化


资源空闲

如果服务器资源充分,同步异步方法均可立即执行。

PPT演示说明:不考虑异步切换消耗时间,使用异步Action:
  • 如果异步方法(a-Method)执行时间大于期间(灰色)MVC-caller执行时间,节省MVC-caller执行时间
  • 否则节省异步方法(a-Method)执行时间


拥挤排队

假如IIS的所有线程都已经全部耗尽:

  • 如果都是同步的Action,新到的request只能排队等待
  • 如果有异步Action,且(注意这个“且”)某一异步Action不会消耗IIS资源,该异步Action就可以在其await的时候,挂起异步方法,开始处理新到request。

PPT演示说明:如果service需要IIS自己处理,IIS仍然没有资源来接收新Request。


代价

异步切换


异常

MVC 异步Action
赞: 158 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0

后台开发


ADO和EF

如何通过C#进行数据库的读取,包含ADO.NET和Entity Framework相关知识……

ASP.NET框架

综合之前所学,连接前端和数据库,包括RazorPage、MVC和其他(如WebForm/WebApi等)技术……

RazorPages(Core)

微软推荐的、最新的、基于Razor页面和.NET core的新一代Web项目开发技术,包括Razor Tag Helper、Model绑定和Validation、Session/Cookie、内置依赖注入等……

MVC(Framework)

过去两年间最流行的、基于.NET Framework和MVC模式的ASP.NET MVC框架,主要用于讲解安全、性能、架构和各种实战功能演示……

C#语法

从入门的变量赋值、分支循环、到面向对象,以及更先进的语言特性,如:泛型、Lambda、Linq、异步方法等…………

Java语法

面向过程的变量赋值、分支循环和函数封装;面向对象的封装、继承和多态;以及更高阶的常用类库(集合/IO/多线程……)、lambda等

Java Web开发

SpringMVC

分层架构和综合实战

全部
关键字



帮助

反馈