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

原创 2007年09月28日 10:39:00
ASP.NET 2.0的异步页面刷新功能真得很酷,今天尝试用它解决我的一个应用问题,真是帮了大忙了。
我的页面要向后台的socket服务提交一个查询,首先这是一个可能长时间不返回的操作;其次为了拿到socket服务返回的长度不定、有可能很大的Response数据,我不得不采用了dotNETIAsyncResult 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 本质上不支持异步页,但是通过坚韧的努力和不懈地创新可以生成异步页。有关更多概述信息,请参阅 MSDN®Magazine 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)
     来做合适的处理。
 
 

ASP.NET 2.0无刷新页面新境界(转载)

     “无刷新页面”,只是一种不确切的效果描述(其实还有其他各种方法来实现这个效果),更确切的说法是:在页面上用JavaScript调用服务器端的一个方法,然后处理返回的数据。实现它最标准的方法当...

ASP.NET 2.0中的跨页面提交

简介         在ASP.NET 1.X 版本中,页面都是提交到自己本身,并不能方便的指定需要提交的目的页面。例如FirstPage.aspx中的button只能提交到FirstPage.as...

asp.net 2.0 缓存(页面输出缓存)

页面输出缓存作为最简单的缓存形式,输出缓存只是在内存中保留为响应请求而发送的 HTML 的副本。其后再有请求时将提供缓存的输出,直到缓存到期,这样,性能有可能得到很大的提高(取决于需要多少开销来创建原...

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

原文出处:http://www.ad0.cn/netfetch/article.asp?id=285 sitemapdatasource,sitemapdatasource中还可以绑定到不同的其他页面...
  • rtyytr
  • rtyytr
  • 2011年05月23日 10:45
  • 2442

asp.net防止页面刷新的办法

  • 2011年11月21日 10:42
  • 41KB
  • 下载

ASP.NET页面刷新方法总结

  • 2011年09月01日 10:00
  • 54KB
  • 下载

ASP.NET页面刷新的几种实现方法

先看看ASP.NET页面刷新的实现方法: 第一: private void Button1_Click( object sender, System.EventArgs e ) {...
  • yl_99
  • yl_99
  • 2011年07月05日 10:01
  • 302

asp.net页面刷新方法

asp.net页面刷新有问题,收藏几种方法挺有用的. 第一: private void Button1_Click( object sender, System.EventArgs e )   ...

asp.net页面刷新重是有问题,收藏几种方法挺有用的.

asp.net页面刷新重是有问题,收藏几种方法挺有用的.第一:private void Button1_Click( object sender, System.EventArgs e )   {  ...
  • tearsmo
  • tearsmo
  • 2011年07月27日 10:15
  • 652
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET 2.0的异步页面刷新真给劲
举报原因:
原因补充:

(最多只允许输入30个字)