zoukankan      html  css  js  c++  java
  • 在 ASP.NET MVC 中使用异步控制器

    线程池

    一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个版本,才能趋于规范。 ASP.NET MVC 中为什么需要使用异步呢,IIS有一个线程池来处理用户的请求,当一个新的请求过来时,将调度池中的线程以处理该请求,然而,但并发量很高的情况下,池中的线程已经不能够满足这么多的请求时候,池中的每一个线程都处于忙的状态则在处理请求时将阻塞处理请求的线程,并且该线程不能对另一个请求提供服务,如果请求队列已满,则 Web 服务器会拒绝请求并处于 HTTP 503繁忙状态。如果是处理一些高延迟,例如网络操作,这样的线程大多数只是等待状态大部分时间是不做任何事情的,这样的线程就可以使用异步编程更好的充分利用。

    异步处理

    例如:如果某个请求生成一个需要两秒钟来完成的网络调用,则该请求无论是同步执行还是异步执行都需要两秒钟。 但是,在异步调用的过程中,服务器在等待第一个请求完成的过程中不会阻塞对其他请求的响应。 因此,当有许多请求调用长时间运行的操作时,异步请求可以防止出现请求排队的情况。在.NET 4.5中最大线程池为 5000 .NET 4.5中也增加了 await与async关键字来简化异步编程。

    同步还是异步(摘录MSDN)

    通常,在满足以下条件时使用同步管线:

    • 操作很简单或运行时间很短。

    • 简单性比效率更重要。

    • 此操作主要是 CPU 操作而不是包含大量的磁盘或网络开销的操作。 对 CPU 绑定操作使用异步操作方法未提供任何好处并且还导致更多的开销。

    通常,在满足以下条件时使用异步管线:

    • 操作是网络绑定的或 I/O 绑定的而不是 CPU 绑定的。

    • 测试显示阻塞操作对于网站性能是一个瓶颈,并且通过对这些阻塞调用使用异步操作方法,IIS 可对更多的请求提供服务。

    • 并行性比代码的简单性更重要。

    • 您希望提供一种可让用户取消长时间运行的请求的机制。

    ASP.NET MVC 中使用异步

            // GET: Async
            [AsyncTimeout(1000)]
            public async Task<ActionResult> Index()
            {
                var data = await GetPageTaskAsync("http://163.com");
    return data; } /// <summary> /// 处理异步请求 /// </summary> /// <param name="url"></param> /// <returns></returns> public async Task<ActionResult> GetPageTaskAsync(string url) { try { using (var client = new HttpClient()) { await Task.Delay(3000); var fetchTextTask = client.GetStringAsync(url); return Json(new { fetchText = await fetchTextTask, error = "NO" }, JsonRequestBehavior.AllowGet); } } catch (WebException exception) { throw exception; // TODO: Logging, update statistics etc. } } }

    Refer:

    when-should-i-use-async-controllers-in-asp-net-mvc

    http://stackoverflow.com/questions/30566848/when-should-i-use-async-controllers-in-asp-net-mvc

    看stackoverflow大牛如何回答何时在ASP.NET中使用异步控制器?
    http://www.cnblogs.com/farb/p/5014773.html
    The Managed Thread Pool
    http://msdn.microsoft.com/zh-cn/library/0ka9477y.aspx
    Using an Asynchronous Controller in ASP.NET MVC
    http://msdn.microsoft.com/zh-cn/library/ee728598%28v=vs.100%29.aspx
    Tips and Tricks on how to improve MVC Application Performance
    http://www.robertsindall.co.uk/blog/how-to-improve-mvc-application-performance/
    Using Asynchronous Methods in ASP.NET MVC 4
    http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4
    Asynchronous Action Methods in MVC 4
    http://www.codeproject.com/Tips/573154/Asynchronous-Action-Methods-in-MVC-4

    ASP.NET MVC下的异步Action的定义和执行原理
    http://www.cnblogs.com/artech/archive/2012/06/20/async-action-in-mvc.html

    异步编程中的最佳做法

    https://msdn.microsoft.com/zh-cn/magazine/jj991977.aspx

  • 相关阅读:
    2017 ICPC beijing E
    1629 B君的圆锥
    1298 圆与三角形
    通过String获取字符数组
    Java中的代码点与代码单元
    数据库事务隔离级别
    oracle修改密码、添加用户及授权
    Python起航
    软件测试常见概念
    TestNG--@Factory
  • 原文地址:https://www.cnblogs.com/Irving/p/3917935.html
Copyright © 2011-2022 走看看