ASP.NET MVC 学习笔记-6.异步控制器
2018-06-18 00:14:45来源:未知 阅读 ()
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<ActionResult> TestMethod() 4 { 5 var returnData = await TestMethod(); 6 return Json(returnData,JsonRequestBehavior.AllowGet); 7 } 8 9 public async Task<Data> TestMethod() 10 { 11 //耗时操作 12 return returnData; 13 } 14 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 如何0基础学习C/C++? 2020-06-06
- vtk学习记录(三)——初识vtkRenderer 2020-05-16
- C++基础 学习笔记六:复合类型之数组 2020-04-25
- C++基础 学习笔记五:重载之运算符重载 2020-04-23
- C++基础 学习笔记四:重载之函数重载 2020-04-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash