国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET 2.0的異步頁面刷新真給勁

2024-07-10 13:06:11
字體:
來源:轉載
供稿:網(wǎng)友

asp.net 2.0的異步頁面刷新功能真得很酷,今天嘗試用它解決我的一個應用問題,真是幫了大忙了。

我的頁面要向后臺的socket服務提交一個查詢,首先這是一個可能長時間不返回的操作;其次為了拿到socket服務返回的長度不定、有可能很大的response數(shù)據(jù),我不得不采用了dotnet的iasyncresult beginreceive(byte[] buffer, int offset, int size, socketflags socketflags, asynccallback callback, object state);辦法來異步提交socket命令,然后在回調函數(shù)中迭代調用int endreceive(iasyncresult asyncresult);來獲取response數(shù)據(jù)直到數(shù)據(jù)被取完,這一系列的數(shù)據(jù)片斷都緩存在一個memoryblock鏈表中。

這種情況下,asp.net頁面要想用表格展示response數(shù)據(jù),必須能夠被異步刷新。

asp.net 1.x 本質上不支持異步頁,但是通過堅韌的努力和不懈地創(chuàng)新可以生成異步頁。有關更多概述信息,請參閱 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執(zhí)行完成時執(zhí)行方法

                // hook prerendercomplete event for data binding

                this.prerendercomplete += new eventhandler(page_prerendercomplete);

 

接下來,我在點擊按鈕的事件函數(shù)中,開始我的異步操作之旅:

/// pageasynctask 的方式則是增強版本,除了異步頁面處理開始和結束方法自身外,

/// 還可以提供在超時情況下的處理方法,以及處理時的狀態(tài)對象。

///

pageasynctask task = new pageasynctask(

    new begineventhandler(beginsubmitkeywordsasyncoperation),

    new endeventhandler(endsubmitkeywordsasyncoperation),

    new endeventhandler(timeoutsubmitkeywordsasyncoperation),

    null

);

registerasynctask(task);

 

/// 對大多數(shù)簡單的異步處理情況,可以直接調用addonprerendercompleteasync 方法,

/// 提交頁面請求開始和結束時的處理代碼

//addonprerendercompleteasync(

//    new begineventhandler(beginsubmitkeywordsasyncoperation),

//    new endeventhandler(endsubmitkeywordsasyncoperation)

//);

 

該頁經(jīng)歷其常規(guī)處理生命周期,直到 prerender 事件剛剛引發(fā)之后。然后,asp.net 調用使用 registerasynctask注冊的 begin 方法beginsubmitkeywordsasyncoperation。這個方法中我將向sokcet服務提交我的命令,然后將socket.beginreceive方法得到的iasyncresult對象返回給asp.net。

         然后,我的socket異步回調函數(shù)在最終全部獲得數(shù)據(jù)流后,通過調用

         callback.invoke(result);

         來通知頁面socket這邊已經(jīng)完成工作了。

         于是asp.net喚起endsubmitkeywordsasyncoperation方法:

        /// <summary>

        /// 異步調用結束后的接收方法(異步操作執(zhí)行完成后,會重新從線程池中取個線程為本頁面請求服務).

        /// </summary>

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

        void endsubmitkeywordsasyncoperation(iasyncresult ar)

        {

            _resultdataset = _submit.getresultdataset(ar);

         在這個函數(shù)中,我就可以拿到數(shù)據(jù)流了。

         之后,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

發(fā)布日期: 2006-4-19 | 更新日期: 2006-4-19

2:

 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 开原市| 安义县| 元谋县| 阜平县| 南乐县| 吉林省| 新源县| 仁化县| 云阳县| 遵化市| 平阳县| 舞钢市| 洛南县| 阿坝| 布尔津县| 收藏| 白水县| 陵水| 从化市| 苏尼特右旗| 鸡西市| 千阳县| 桐庐县| 常山县| 前郭尔| 鄱阳县| 佳木斯市| 鄄城县| 屏边| 衢州市| 海伦市| 即墨市| 竹溪县| 宣城市| 镶黄旗| 聂荣县| 安图县| 紫金县| 疏附县| 抚宁县| 太仆寺旗|