ASP.NET 2.0的异步页面刷新真给劲

asp.net|刷新|页面|异步

ASP.NET 2.0的异步页面刷新功能真得很酷,今天尝试用它解决我的一个应用问题,真是帮了大忙了。

我的页面要向后台的socket服务提交一个查询,首先这是一个可能长时间不返回的操作;其次为了拿到socket服务返回的长度不定、有可能很大的Response数据,我不得不采用了dotNET的IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state);办法来异步提交socket命令,然后在回调函数中迭代调用int EndReceive(IAsyncResult asyncResult);来获取Response数据直到数据被取完,这一系列的数据片断都缓存在一个MemoryBlock链表中。

这种情况下,ASP.NET页面要想用表格展示Response数据,必须能够被异步刷新。

ASP.NET 1.x 本质上不支持异步页,但是通过坚韧的努力和不懈地创新可以生成异步页。有关更多概述信息,请参阅 MSDNMagazine 2003 年 6 月刊的文章“Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code”,该文章的作者是 Fritz Onion。

但ASP.NET 2.0 极大地简化了生成异步页的方式。首先使用该页的 @ Page 指令引入 Async=“true” 属性。

其次,在 Page_Load 时,注册事件Page_PreRender:

        private void Page_Load(object sender, System.EventArgs e)

        {

            if (!IsPostBack)

            {

                // 注册事件Page_PreRender执行完成时执行方法

                // Hook PreRenderComplete event for data binding

                this.PreRenderComplete += new EventHandler(Page_PreRenderComplete);

 

接下来,我在点击按钮的事件函数中,开始我的异步操作之旅:

/// PageAsyncTask 的方式则是增强版本,除了异步页面处理开始和结束方法自身外,

/// 还可以提供在超时情况下的处理方法,以及处理时的状态对象。

///

PageAsyncTask task = new PageAsyncTask(

    new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),

    new EndEventHandler(EndSubmitKeywordsAsyncOperation),

    new EndEventHandler(TimeoutSubmitKeywordsAsyncOperation),

    null

);

RegisterAsyncTask(task);

 

/// 对大多数简单的异步处理情况,可以直接调用AddOnPreRenderCompleteAsync 方法,

/// 提交页面请求开始和结束时的处理代码

//AddOnPreRenderCompleteAsync(

//    new BeginEventHandler(BeginSubmitKeywordsAsyncOperation),

//    new EndEventHandler(EndSubmitKeywordsAsyncOperation)

//);

 

该页经历其常规处理生命周期,直到 PreRender 事件刚刚引发之后。然后,ASP.NET 调用使用 RegisterAsyncTask注册的 Begin 方法BeginSubmitKeywordsAsyncOperation。这个方法中我将向sokcet服务提交我的命令,然后将socket.BeginReceive方法得到的IasyncResult对象返回给ASP.NET。

         然后,我的socket异步回调函数在最终全部获得数据流后,通过调用

         callback.Invoke(result);

         来通知页面socket这边已经完成工作了。

         于是ASP.NET唤起EndSubmitKeywordsAsyncOperation方法:

        /// <summary>

        /// 异步调用结束后的接收方法(异步操作执行完成后,会重新从线程池中取个线程为本页面请求服务).

        /// </summary>

        /// <param name="ar"></param>

        void EndSubmitKeywordsAsyncOperation(IAsyncResult ar)

        {

            _resultDataset = _submit.getResultDataset(ar);

         在这个函数中,我就可以拿到数据流了。

         之后,ASP.NET又唤起Page_PreRender事件,从而可以在这个事件中,把页面上的表格正确填充了。

         这样,就达到了我的目的。而且向后台提交后等待被再度激活超时了,也可以由

         void TimeoutSubmitKeywordsAsyncOperation(IAsyncResult ar)

     来做合适的处理。

 

参考资源:

1:

ASP.NET 2.0 中的异步页

http://www.microsoft.com/china/msdn/library/webservices/asp.net/issuesWickedCodetoc.mspx?mfr=true

发布日期: 2006-4-19 | 更新日期: 2006-4-19

2:

 

时间: 2024-08-03 09:47:15

ASP.NET 2.0的异步页面刷新真给劲的相关文章

ASP.NET 2.0的异步页面刷新

asp.net|刷新|页面|异步 ASP.NET 2.0的异步页面刷新功能真得很酷,今天尝试用它解决我的一个应用问题,真是帮了大忙了. 我的页面要向后台的socket服务提交一个查询,首先这是一个可能长时间不返回的操作:其次为了拿到socket服务返回的长度不定.有可能很大的Response数据,我不得不采用了dotNET的IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags,

ASP.NET 2.0中的页面输出缓存

asp.net|缓存|页面 静态页面全部内容保存在服务器内存中.当再有请求时,系统将缓存中的相关数据直接输出,直到缓存数据过期.这个过程中,缓存不需要再次经过页面处理生命周期.这样可以缩短请求响应时间,提高应用程序性能.很显然,页面输出缓存适用于不需要频繁更新数据,而占用大量时间和资源才能编译生成的页面.对于那些数据经常更新的页面,则不适用.默认情况下,ASP.NET 2.0启用了页面输出缓存功能,但并不缓存任何响应的输出.开发人员必须通过设置,使得某些页面的响应成为缓存的一部分. 设置页面输出

ASP.NET 2.0中的页面输出缓存_实用技巧

静态页面全部内容保存在服务器内存中.当再有请求时,系统将缓存中的相关数据直接输出,直到缓存数据过期.这个过程中,缓存不需要再次经过页面处理生命周期.这样可以缩短请求响应时间,提高应用程序性能.很显然,页面输出缓存适用于不需要频繁更新数据,而占用大量时间和资源才能编译生成的页面.对于那些数据经常更新的页面,则不适用.默认情况下,ASP.NET 2.0启用了页面输出缓存功能,但并不缓存任何响应的输出.开发人员必须通过设置,使得某些页面的响应成为缓存的一部分. 设置页面输出缓存可以使用以下两种方式:一

在ASP.NET 2.0中使用页面导航控件

asp.net|控件|页面 几乎每个网站里,为了方便用户在网站中进行页面导航,都少不了使用页面导航控件.有了页面导航的功能,用户可以很方便地在一个复杂的网站中进行页面之间的跳转.在以往的WEB编程中,要写一个好的页面导航功能,并不是那么容易的,也要使用一些技巧.而在asp.net 2.0中,为了方便进行页面导航,新增了一个叫做页面导航控件sitemapdatasource,其中还可以绑定到不同的其他页面控件,比如treeview,menu等,十分灵活,使到能很方便地实现页面导航的不同形式,而且还

Asp.net 2.0 Treeview无限级无刷新示例

本文给出了使用Asp.net 2.0的Treeview实现无限级无刷新的示例源代码,供大家参考! <%@ Page Language="C#" %> <%@ Import Namespace="System.IO" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dt

Asp.net 2.0 Treeview 无限级无刷新示例

asp.net|treeview|示例|刷新|无刷新 <%@ Page Language="C#" %><%@ Import Namespace="System.IO" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <script

ASP.NET 2.0页面性能的考虑

asp.net|性能|页面 一般情况下我们通常在一个页面中,结合页面事件处理模型,按顺序一步一步的声明各个处理过程.这就是所说的同步处理(Synchronous),我们可以很方便的定义页面处理的顺序.同步处理虽然很方便,但在耗时高请求处理的时候就会暴露严重的问题,在一个高并发的网站生产服务器上,由于.net处理是基于所谓的ThreadPool的,而Threadpool中的处理线程又是有限的,如果当前ThreadPool中的线程已经全部用尽,而后继又有不断的大规模请求的话,服务器的性能就会严重的下

ASP.NET 2.0中实现跨页面提交

asp.net|页面 在ASP.NET 1.X 版本中,页面都是提交到自己本身,并不能方便的指定需要提交的目的页面.例如FirstPage.aspx中的button只能提交到FirstPage.aspx,而不能提交到SecondPage.aspx.很多时候,ASP.NET 1.X这样工作方式使我们的开发方式受到不少限制.熟悉ASP/JSP/PHP的朋友大概很不习惯,因为以前经常使用的提交方式突然无法使用,虽然也有解决这个问题的方法(演示Webcast),可是过程太烦琐,不甚方便.令我们高兴的是,

ASP.NET 2.0 中的异步页功能应用

asp.net|异步 下载本文源代码:WickedCode0510.exe ASP.NET 2.0 提供了大量新功能,其中包括声明性数据绑定和母版页,成员和角色管理服务等.但我认为最棒的功能是异步页,接下来让我告诉您其中的原因. 当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程.一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程用于处理其他请求.如果一个同步请求成为 I/O 绑定(例如,如果它调用一个远程 Web 服务或查询一个远程数据库,并等待调用