ASP.NET MVC 学习笔记-6.异步控制器

本文介绍了IIS工作原理及线程池管理机制,探讨了如何利用异步控制器解决线程饥饿问题,包括异步控制器的基本概念、工作流程及其创建方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 }

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值