VisualStudio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法。如果我们需要定义异步Action方法,必须继承抽象类AsyncController。下面学步园小编来讲解下Action怎么基于线程池的请求处理?异步Action方法有哪些?
Action怎么基于线程池的请求处理
ASP.NET通过线程池的机制处理并发的HTTP请求。一个Web应用内部维护着一个线程池,当探测到抵达的针对本应用的请求时,会从池中获取一个空闲的线程来处理该请求。当处理完毕,线程不会被回收,而是重新释放到池中。线程池具有一个线程的最大容量,如果创建的线程达到这个上限并且所有的线程均被处于“忙碌”状态,新的HTTP请求会被放入一个请求队列以等待某个完成了请求处理任务的线程重新释放到池中。
我们将这些用于处理HTTP请求的线程称为工作线程(WorkerThread),而这个县城池自然就叫做工作线程池。ASP.NET这种基于线程池的请求处理机制主要具有如下两个优势:
工作线程的重用:创建线程的成本虽然不如进程的激活,却也不是一件“一蹴而就”的事情,频繁地创建和释放线程会对性能造成极大的损害。而线程池机制避免了总是创建新的工作线程来处理每一个请求,被创建的工作线程得到了极大地重用,并最终提高了服务器的吞吐能力。
异步Action方法有哪些
在了解了在AsyncController中定义异步Action方法的必要性之后,我们来简单介绍一下异步Action方法的定义方式。总的来说,异步Action方法具有两种定义方式,一种是将其定义成两个匹配的方法XxxAsync/XxxCompleted,另一种则是定义一个返回类型为Task的方法。
1:publicclassHomeController:AsyncController
3:publicvoidArticleAsync(stringname)
4:{
5:AsyncManager.OutstandingOperations.Increment();
6:Task.Factory.StartNew(()=>
7:{
8:stringpath=ControllerContext.HttpContext.Server.MapPath(string.Format(@"articles{0}.html",name));
9:using(StreamReaderreader=newStreamReader(path))
10:{
11:AsyncManager.Parameters["content"]=reader.ReadToEnd();
12:}
13:AsyncManager.OutstandingOperations.Decrement();
14:});
15:}
16:publicActionResultArticleCompleted(stringcontent)
17:{
18:returnContent(content);
19:}
20:}
以上就是关于“Action怎么基于线程池的请求处理?异步Action方法有哪些”的内容,希望对大家有用。更多资讯请关注学步园。学步园,您学习IT技术的优质平台!