HttpApplication中的异步线程

一、Asp.net中的线程池设置

  在Asp.net的服务处理中,每当服务器收到一个请求,HttpRuntime将从HttpApplication池中获取一个HttpApplication对象处理此请求,请求的处理过程将被排入线程池中,对于Asp.net来说,在Machine.config文件的processModel部分中可以设置线程池中的参数。

  Asp.net线程相关的参数配置:

参数 配置
autoConfig 基于服务器的配置自动设置。
maxWorkerThreads 设置每个CPU的最大工作线程数量,可以设置为5~100,默认为20,建议设置为100
minWorkerThreads 设置每个CPU的最少工作线程数量,默认为1
maxIoThreads 配置每个CPU的最大I/O线程数量,可以设置的范围为5~100,默认为20,建议设置为100
minIoThreads 配置每个CPU最少工作线程数量,默认为1

  HttpRuntime元素的配置参数:

参数 配置
minFreeThreads 处理新请求保留的最少自由线程数量,默认值为8.建议每CPU设置为88个。这些最小空闲线程用于避免没有线程可用而造成死锁。因此,当线程池的线程小于这个数,请求就被排入队列,而不会使用这些线程处理。
minLocalRequestFreeThreads 为本地主机请求保留的最少自由线程数量,默认值为4.建议每CPU设置为76个。同上(只是针对本地请求)
appRequestQueueLimit 在Asp.net没有足够的线程来处理请求的时候,将会把这些请求排入一个请求队列中等待处理,该项用来设置这个队列的长度,当队列长度超过这个参数将返回503、默认为5000。

  优化的第一原则是:对于每一个请求尽可能使用一个线程完成处理。

二、异步步骤中的异步点

  在HttpApplication的处理过程中,为了提高线程的利用率,对于一个请求尽可能只使用一个线程完成处理。

  由于Asp.net处理采用管道的处理模式,必须保证处理步骤的逻辑顺序。所以,有些处理必须在后继的处理之前完成,所以,除非此时真的需要多个可以并行的计算密集任务,否则,启动多个线程并不能提高网站的处理速度。

对于HttpApplication处理管道中每一个事件的处理步骤,有同步与异步两个方式处理:

  • 同步:提供一个事件处理方法直接完成处理步骤;
  • 异步:一个用于启动涉及I/O的处理步骤,一个用于I/O完成之后的处理步骤;

  对于一个需要等待的处理步骤,我们可以分出一个异步点,在这个异步点之前启动耗时的操作,然后直接结束当前的线程,在没有线程参与的情况下,进行这个耗时的输入输出任务(耗时但不需要线程参与的阶段,就称异步点),在任务完成之后,重新从线程池获取一个线程来继续当前请求的处理。

  如同步的BeginRequest对应的异步处理方式定义如下:

public void AddOnBeginRequestAsync(BeginEventHandler bh, EndEventHandler eh)

  其中BeginEventHandler用于启动处理的委托,EndEventHandler用于处理完成任务之后的委托。

  对于HttpApplication管道的处理来说,这些事件使用的同步方式的委托类型都是EventHandler类型,这个委托类型的定义如下:

public delegate void EventHandler(Object sender, EventArgs e)

  对于异步方式的处理,则使用相应的两个委托完成,一个用于启动的委托BeginEventHandler,一个用于结束的委托EndEventHandler。结束操作的委托将工作在一个线程池提供的线程之上。

  在异步方式下,处理管道将不再连续使用一个线程完成,而是每个处理步骤都可能在一个线程上进行,所以,我们不能假定处理管道总是处于一个线程,而使用基于线程的特征。

三、启动和完成异步步骤

  在Asp.net中,启动与完成异步步骤的对象分别如下:

  • 启动异步步骤的委托类型为System.Web.BeginEventHandler。
  • 完成异步步骤的委托类型为System.Web.EndEventHandler。

  其委托的定义如下:

public delegate IAsyncResult BeginEventHandler(Object sender,EventArgs e,AsyncCallback cb,Object extraData)
public delegate void EndEventHandler(IAsyncResult ar)

  可以看到,实际上与AsyncCallback委托的类型是完全一样的。

  其中AsyncCallback类型定义了完成处理之后调用方法的类型,这个类型定义如下:

public delegate void AsyncCallback(IAsyncResult ar)

  而extraData则定义了可以传递到AsyncCallback方法的一个自定义的参数对象。

四、异步处理程序

  对于同步的处理程序,通过接口IHttpHandler中定义的方法ProcessRequest进行处理。这个方法的定义如下:

void ProcessRequest(HttpContext context)

  对于异步的处理程序,这个方法也同样被两个方法所代替,这就是定义在异步处理程序接口IHttpAsyncHandler中的两个方法

  • BeginProcessRequest;
  • EndProcessRequests;

  如果一个处理程序实现了异步的接口,那么HttpApplication将使用异步方法来调用这个处理程序。

  1、异步处理程序接口

  异步的处理程序接口定义在命名空间System.Web下:

public interface IHttpAsyncHandler : IHttpHandler
{
  IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData);
  void EndProcessRequest(IAsyncResult result);

  bool IsReusable { get; }
  void ProcessRequest(HttpContext context);
}

  2、在处理程序中异步调用Web服务

  对于一个典型的Web服务来说,我们需要在BeginProcessRequest方法的最后调用启动调用Web服务的方法,然后这个方法就可以结束了。

  系统随后在没有线程参与的情况下进行漫长的Web服务调用,当服务调用完成之后,Asp.net将会把EndProcessRequest排入线程池的I/O线程队列中。最后,EndProcessRequest将被调用。在这个方法中,我们通过调用结束Web服务的方法来获取服务返回的数据。

五、异步页面

  页面Page是Asp.net网站开发中最常用到的页面生成技术,从本质上将,它也是一个处理程序。从Page类的目的来说,它主要用来生成HTML的特殊处理程序。

  这个处理程序默认情况下实现了IHttpHandler接口,所以,可以看成一个同步的处理程序。如果我们需要实现异步的页面处理程序,并不需要手工修改它所实现的接口,而是通过页面指令Async来指定。当设置为true的时候,表示生成的页面类将实现接口IHttpAsyncHandler。这样,这个页面对象将通过异步方法被访问。

<%@ Page Async="true" %>

  在这种情况下,页面处理的过程将被分成两个部分:从开始到包括PreRender处理部分由IHttpAsyncHandler接口中的BeginProcessRequest方法处理;从PreRenderComplete到处理结束将由EndProcessRequest方法处理。在PreRender和PreRenderComplete之间就是异步页面的异步点。这个过程用来等待长时间异步操作的完成。

  1、页面异步任务的启动和完成

  页面对象的AddOnPreRenderCompleteAsync方法用来注册异步操作的两个方法,这两个方法将在异步点之前和异步点之后被调用。

  这两个委托就是:

  • BeginEventHandler;
  • EndEventHandler;

  2、异步页面任务

  在Asp.net 2.0以后,可以通过PageAsyncTask在页面的处理中注册多个异步操作,每一个操作通过PageAsyncTask定义。

public sealed class PageAsyncTask

  使用这个类的时候,页面的异步状态可以设置为true,也可以设置为false。当设置为false的时候,页面的处理线程将被阻塞,所以,在使用异步页面任务的时候,应该将页面设置为异步状态。

  通过类的构造函数,我们定义异步任务的开始处理方法、完成处理方法,甚至还可以提供一个超时的处理方法。最复杂的一个构造函数如下所示:

public PageAsyncTask(  BeginEventHandler beginHandler,  EndEventHandler endHandler,  EndEventHandler timeoutHandler,  Object state,  bool executeInParallel)

  页面对象的RegisterAsyncTack(PageAsyncTask task)可以注册异步任务:

public void RegisterAsyncTask(
  PageAsyncTask task
)

  3、异步页面中访问Web服务的三种方式

  暂时跳过

HttpApplication中的异步线程,布布扣,bubuko.com

时间: 2024-10-17 05:31:48

HttpApplication中的异步线程的相关文章

Android之异步线程原理

基础介绍 异步消息处理线程是指,线程在启动后会进入一个无线循环体中,没循环一次,从内部的消息队列中取出一个一个消息,并回调相应的消息处理函数,执行完一个消息后则继续循环.如果消息队列为空,线程会暂停,知道消息队列中有新的消息. 异步消息处理线程本质上仍然是一个线程,只不过这种线程的执行代码设置成如上所述的逻辑而已.在android中实现异步线程主要涉及到如下几个类:ThreadLocal,Looper,MessageQueue,Handler,Message,接下来我们一一介绍这几个类,解析An

Task_取消异步计算限制操作CancellationTokenSource和异步线程中异常的捕获

why:ThreadPool没有内建机制标记当前线程在什么时候完成,也没有机制在操作完成时获得返回值,因而推出了Task,更精确的管理异步线程. How:通过构造方法的参数TaskCreationOptions控制如何创建任务,具体查看该枚举的枚举值.获取任务执行的结果有Task.Result属性,该属性内部调用wait(),例如WaitAny().WaitAll()等等都可以. 如何取消执行中的任务呢? 实例化CancelletionTokenSource类,把该对象作为参数传给异步方法,在异

Android中使用Thread线程与AsyncTask异步任务的区别

最近和几个朋友交流Android开发中的网络下载问题时,谈到了用Thread开启下载线程时会产生的Bug,其实直接用子线程开启下载任务的确是很Low的做法,那么原因究竟如何,而比较高大上的做法是怎样?于是用这篇博文详细分析记录一下. 一.概念介绍 Thread是指在CPU运行的一个程序中,可以有多个执行路径.运行的程序称作进程,而这个执行路径,就被称为线程(如果对这两个名词不太理解的同学可以参考一下操作系统方面的书籍).Java中的多线程是指多个Thread可以在一段内同步执行,这样可以提高代码

Eclipse RCP中超长任务单线程,异步线程处理

转自:http://www.blogjava.net/mydearvivian/articles/246028.html在RCP程序中,常碰到某个线程执行时间比较很长的情况,若处理不好,用户体验度是很糟糕的,如用户点了一个功能按钮后,进入功能执行,发现程序长时间没有任何响应,无疑这种情况下,用户是无法忍受的.    在这种情况下我们可以通过提供进度条对话框来改善用户体验度:     1)单步执行            程序执行期间不允许用户终止,贴下程序代码段                 P

ASP.NET MVC中使用异步控制器

线程池 一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个版本,才能趋于规范. ASP.NET MVC 中为什么需要使用异步呢,IIS有一个线程池来处理用户的请求,当一个新的请求过来时,将调度池中的线程以处理该请求,然而,但并发量很高的情况下,池中的线程已经不能够满足这么多的请求时候,池中的每一个线程都处于忙的状态则在处理请求时将阻塞处理请求的线程,并且该

使用C++11 开发一个半同步半异步线程池

摘自:<深入应用C++11>第九章 实际中,主要有两种方法处理大量的并发任务,一种是一个请求由系统产生一个相应的处理请求的线程(一对一) 另外一种是系统预先生成一些用于处理请求的进程,当请求的任务来临时,先放入同步队列中,分配一个处理请求的进程去处理任务, 线程处理完任务后还可以重用,不会销毁,而是等待下次任务的到来.(一对多的线程池技术) 线程池技术,能避免大量线程的创建和销毁动作,节省资源,对于多核处理器,由于线程被分派配到多个cpu,会提高并行处理的效率. 线程池技术分为半同步半异步线程

线程池和异步线程

目录: 1 什么是CLR线程池? 2 简单介绍下线程池各个优点的实现细节 3 线程池ThreadPool的常用方法介绍 4 简单理解下异步线程 5 异步线程的工作过程和几个重要的元素 6 有必要简单介绍下Classic Async Pattern 和Event-based Async Pattern 7 异步线程的发展趋势以及.net4.5异步的简化 8 本章示例 自定义一个简单的线程池 Asp.net异步IHttpAsyncHandler示例 9 本章总结 1 什么是CLR线程池? 在上一章中

Async in C# 5.0(C#中的异步编程Async) 蜗牛翻译之第一章

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,祝各位爱技术的园友在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力

浅谈Android中的异步加载之ListView中图片的缓存及优化三

     隔了很久没写博客,现在必须快速脉动回来.今天我还是接着上一个多线程中的异步加载系列中的最后一个使用异步加载实现ListView中的图片缓存及其优化.具体来说这次是一个综合Demo.但是个人觉得里面还算有点价值的就是里面的图片的缓存的实现.因为老实说它确实能在实际的项目中得到很好的应用.主要学习来源于慕课网中的异步加载学习,来自徐宜生大神的灵感.本次也就是对大神所讲知识的一个总结及一些个人的感受吧. 这次是一个综合的Demo,主要里面涉及到的知识主要有:网络编程.异步加载.JSON解析.