放飞你的梦想--翱翔我的天空 | 会员登陆 | 繁體中文 | 站点地图 | 站长博客
 | 网站首页 | 文章中心 | IT 前沿 | 清怡画风 | 视频教程 | 资源下载 | 精彩图库 | 博客文赏 | 天空论坛 | 访客留言 | 音乐版 | 
    本站全新推出IT 前沿频道欢迎大家访问 地址 http://it.tkbbs.com  [风雪残士  2005年12月9日]            本站推出新浪VIVI收藏夹服务,欢迎使用  [风雪残士  2005年10月18日]        
您现在的位置: 翱翔翼站 >> 文章中心 >> 编程开发 >> 网页开发 >> ASP.NET >> 文章正文 今天是:
ASP.NET 2.0的异步页面刷新 【字体:
作 者:佚名 文章来源:网络 更新:2006-8-15 1:37:37 点击:







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 本质上不支持异步页,但是通过坚韧的努力和不懈地创新可以生成异步页。有关更多概述信息,请参阅 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)

     来做合适的处理。

 

参考资源:

1:

ASP.NET 2.0 中的异步页

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

http://www.cnblogs.com/zhengyun_ustc/archive/2006/08/08/asp_net_2_0_pageasynctask.html



文章录入:风雪残士    责任编辑:风雪残士 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    相关文章
    Delphi编写组件封装asp代码的…
    用Delphi开发报表打印的ASP组…
    如何在Delphi中实现ASP编程
    用DELPHI为ASP开发文件上载组…
    如何在Delphi中实现ASP编程
    P/Invoke能够在asp.net中使用
    ASP.Net生成后台脚本的问题的…
    ASP.NET 2.0 Club Web Site …
    ASP.Net2.0 WebPart趣味网页…
    ASP.NET超时设置
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    最新文章 TOP10
    最新热门 TOP10
    最新推荐TOP10
    翱翔翼站拥有本站所有版权! Copyright © 2005 - 2008 5-IT.COM
    本站维护 :风雪残士

    浙ICP备05039908号
    努力打造国内最全的电脑技术资料库