当前位置:主页   - 电脑 - 网站开发 - ASP.Net
Make Asynchronous Calls from Page
来源:网络   作者:   更新时间:2012-08-08
收藏此页】    【字号    】    【打印】    【关闭
 

  对于ASP.NET pages的请求需要有HTTP handler来处理,比如Page的instance。当有一个request来请求某个.aspx页面时,ASP.NET runtime会从ASP.NET thread pool中选一个thread来处理这个request, 并且在这个请求处理完成时释放这个thread。因此,如果这个  request请求的页面中的某一个Step花费了相对较长的时间,比如调用某个web service来获取数据,那么结果就是处理这个请求的thread会一直处于idle的状态,而不能处理新的请求。而之所以这个thread会处于idle的状态,是由于ASP.NET handler处理请求时采用的是同步的方式。

  为了解决这个问题,在ASP.NET 1.0中可以通过实现IHTTPAsyncHandler来实现异步的方式。而在ASP.NET 2.0之后,实现异步方式变得了更加的简单了。本文就介绍两种实现异步的方法。

  1. Asynchronous Pages

  要将一个普通的ASP.NET页面变成一个asynchronous page,只需要在 @Page directive 设置 Async=”true” 就可以了。

<%@ Page Async="true" %>

  除此之外,还需要在Page_Load事件中来注册需要完成的异步事件。在Asynchronous page中,可以通过调AddOnPreRenderCompleteAsync这个方法来注册,注册一对Begin/End的event handler。

1: AddOnPreRenderCompleteAsync(

2:         new BeginEventHandler(BeginTask),

3:         new EndEventHandler(EndTask));

  BeginEventHandler的方法签名

IAsyncResult BeginTask(object sender, EventArgs e, AsyncCallback cb, object state)

  EndEventHandler的方法签名就相对的简单了

void EndTask(IAsyncResult ar)

  那么注册的异步事件是在什么时候被执行的呢?在PreRenderComplete之前,你注册了异步事件,注册的BeginEventHandler事件t会开始执行。当异步事件执行完成后,Page就会从PreRenderComplete开始,继续完成生命周期中剩下的各个事件。为了验证异步事件是否确实是在这个PreRenderComplete事件中被执行的,我们可以再 Begin/End 事件中往页面的Trace中写入信息,并打开页面的Trace,然后看输出的Track信息

  如下:

  aspx.page

  Begin PreRender

  0.000143719091709968

  0.000011

  aspx.page

  End PreRender

  0.000170049306985077

  0.000026

 

  Begin asyc: Thread=6

  0.00101590747269794

  0.000846

 

  End async: Thread=7

  2.20676898637082

  2.205753

  aspx.page

  Begin PreRenderComplete

  2.20682859505263

  0.000060

  aspx.page

  End PreRenderComplete

  2.20684834271408

  0.000020

  从Trace信息中可以看出,注册的异步事件就是在PreRender和PreRenderComplete之间执行的。

  2. RegisterAsyncTask 方法

  除了AddOnPreRenderCompleteAsync之外,还可以用 RegisterAsyncTask 来注册异步事件。甚至,RegisterAsyncTask 也许是一个更好的方法。

PageAsyncTask task = new PageAsyncTask(

  new BeginEventHandler(BeginTask),

  new EndEventHandler(EndTask),

  null,

  null);

 

RegisterAsyncTask(task);

  RegisterAsyncTask 接受一个PageAsyncTask参数,这个task参数中可以设置的除了 Begin/End 事件外,还可以做一些别的设置,如timeout时的handler等。timeout的默认时间是45秒,这个时间可以在 @Page directive中和web.config文件中进行设置

  3. 两者比较

  RegisterAsyncTask 只是一个API方法,在异步和同步的页面中都可以使用。而AddOnPreRenderCompleteAsync只能在异步页面中使用

  RegisterAsyncTask 的end handler执行时,能够获得更多的信息,如HTTP context 信息。

  当执行单个任务时,两者几乎一样,而当需要执行多个task时,则应该选用RegisterAsyncTask ,因为它允许多个任务同时执行

  4. Aysnc-Compliant Action

  什么样的操作应该或者建议使用async的操作呢? 大致上, CPU bound 或者 I/O bound的操作可以考虑采用异步的方式。尤其是在有大量IO操作的方法。这时,大量的时间都花费在了读取/写入或者操作数据上,这时,cpu就处于idle的状态,等待IO操作的完成

  出处:http://www.cnblogs.com/jun1st/admin/www.cnblogs.com/jun1st

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明