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

首頁 > 學院 > 開發設計 > 正文

ASP.NET 2.0的異步頁面刷新

2019-11-18 17:04:19
字體:
來源:轉載
供稿:網友

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://m.survivalescaperooms.com/zhengyun_ustc/archive/2006/08/08/asp_net_2_0_pageasynctask.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昌黎县| 霍州市| 梁平县| 金阳县| 贵德县| 龙泉市| 宜黄县| 通化市| 福清市| 扎鲁特旗| 阿勒泰市| 平阴县| 永康市| 黎平县| 安远县| 绩溪县| 乐业县| 罗平县| 鄂州市| 阜新| 连江县| 洛南县| 巴青县| 防城港市| 霸州市| 行唐县| 赤壁市| 富裕县| 恩平市| 隆尧县| 增城市| 郴州市| 水城县| 井研县| 衡东县| 洞口县| 灯塔市| 洞口县| 陆良县| 城市| 东港市|