首页 > 编程 > .NET > 正文

ASP.NET 2.0的异步页面刷新

2024-07-10 13:09:59
字体:
来源:转载
供稿:网友

最大的网站源码资源下载站,

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)

     来做合适的处理。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表