博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET MVC 学习笔记-6.异步控制器
阅读量:4315 次
发布时间:2019-06-06

本文共 2153 字,大约阅读时间需要 7 分钟。

1)         异步控制器的由来

  对于IIS,它维护了一个.NET线程池来处理客户端请求,这个线程池称为工作线程池,其中的线程称为工作线程。当IIS接收到一个请求时,需要从工作线程池中唤醒一个工作线程,并处理请求,处理完成后,工程线程再被线程池回收。使用线程池回收机制,通过线程的重复使用,避免了每次接受请求都创建一个新的线程,从而避免了服务器发生崩溃的风险。

  绝大部分情况下,请求的执行过程都是非常快的。但是在个别情况可能会调用耗时操作(比如,读取文件或调用其他服务),造成工作线程耗用大量时间,这种情况下,线程池可能会没有多余的资源可用,从而发生Thread Starvation线程。当出现这种问题时,后续的客户端请求将会被放入队列,直到有工作线程被释放,但是,当队列也达到一定的数目时,就不会再接受新的请求,直接返回503错误码(服务器忙碌)。

2)         异步控制器的工作步骤

  为了避免出现上述问题,可以使用异步控制器方式来操作耗时比较长的操作,它的工作步骤如下:

  ASP.NET从线程池获取工作线程来处理请求,异步调用完ASP.NET MVC 操作后,它将工作线程返还给线程池以便处理其他的情况,异步操作在其他线程上执行完成后,通过ASP.NET已完成,然后从线程池获取一个工作线程,调用这个线程处理请求的返回。

3)         异步控制器的创建

  平常使用的控制器都是从Controller中派生出来,而异步控制器需要从AsynController派生出来,这个基类提供了异步处理请求的帮助方法。

在ASP.NET MVC4框架之前,遵守下面的开发契约来创建异步控制器的方法,

操作名称Async:

         此方法必须返回void,它会开始异步处理过程。

操作名称Completed:

         此方法会在异步处理完成后调用,它的返回结果是ActionResult。

1 public class TestController:AsynController 2 { 3     public void TestAsync() 4     { 5         AsyncManager.OutstandingOperations.Increment(); 6         var worker = new BackgroundWorker(); 7         worker.DoWork +=(o,e)=>TestMethod(e); 8         worker.RunWorkerCompleted+=(o,e)=>{                      9               AsyncManager.Parameters["ReturnData"]=e.Result;10               AsyncManager.OutstandingOperations.Decrement();11         };12         worker.RunWorkerAsync();13     }14     15     public void TestMethod(DoWorkEventArgs e)16     {17         //处理过程18         e.Result=returnData;19     }20     21     public ActionResult TestCompleted(returnData)22     {23         return Json(returnData,JsonRequestBehavior.AllowGet);24         25     }26 }

 

 

Ps:AsyncManager.OutstandingOperations在操作开始前+1,操作完成后减1。它的作用就是通过ASP.NET 框架目前有多少个等待操作,当属性OutstandingOperations为0时,ASP.NET会完成所有的异步请求方法,并且调用XXXCompleted方法。

 

.Net Framework4.5引入了新的关键字async和await后简化了异步编程模型。上述代码就可以调整为:

1 public class TestController:AsynController 2 { 3     public async Tash
TestMethod() 4 { 5 var returnData = await TestMethod(); 6 return Json(returnData,JsonRequestBehavior.AllowGet); 7 } 8 9 public async Task
TestMethod()10 {11 //耗时操作12 return returnData;13 }14 }

 

转载于:https://www.cnblogs.com/DreamOfLife/p/9016882.html

你可能感兴趣的文章
学习笔记_vnpy实战培训day04_作业
查看>>
OCO订单(委托)
查看>>
学习笔记_vnpy实战培训day06
查看>>
回测引擎代码分析流程图
查看>>
Excel 如何制作时间轴
查看>>
matplotlib绘图跳过时间段的处理方案
查看>>
vnpy学习_04回测评价指标的缺陷
查看>>
iOS开发中遇到的问题整理 (一)
查看>>
Linux(SUSE 12)安装jboss4并实现远程访问
查看>>
Neutron在给虚拟机分配网络时,底层是如何实现的?
查看>>
netfilter/iptables全攻略
查看>>
Overlay之VXLAN架构
查看>>
Eclipse : An error occurred while filtering resources(Maven错误提示)
查看>>
在eclipse上用tomcat部署项目404解决方案
查看>>
web.xml 配置中classpath: 与classpath*:的区别
查看>>
suse如何修改ssh端口为2222?
查看>>
详细理解“>/dev/null 2>&1”
查看>>
suse如何创建定时任务?
查看>>
suse搭建ftp服务器方法
查看>>
centos虚拟机设置共享文件夹并通过我的电脑访问[增加smbd端口修改]
查看>>