Asp.Net2.0中實現多任務非同步頁的一點提示

來源:互聯網
上載者:User

如果想學習Asp.Net2.0的非同步頁技術,那麼一定要仔細閱讀http://www.microsoft.com/china/MSDN/library/default.mspx?mfr=true,並且下載它的原始碼仔細揣摩。全文共介紹了3種實現非同步頁的編程模型,且功能一種比一種強大。多餘的我就不多說了,直接看最後一種模型:使用PageAsyncTask類、RegisterAsyncTask方法、ExecuteRegisteredAsyncTasks方法和TimeoutAsyncOperation方法註冊並執行非同步任務,並針對長時間無響應的情況調用逾時處理方法。原文所提供源碼的AsyncPageTask.aspx.cs檔案詳細樣本了使用這個模型實現非同步頁的方法。
        這個模型最大的好處在於可以在一次頁面請求中處理多個非同步任務,並且還可以用逾時處理來避免在執行非同步作業時出現的無響應情況。原作者僅僅在Page_Load中註冊了一個非同步任務,那麼我們仿照他的做法,再註冊一個非同步任務,如下所示:

<%@ Page Async="true" AsyncTimeout="5" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="AsyncPageTask.aspx.cs" Inherits="AsyncPageTask" Title="Untitled Page" %>

 

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            PageAsyncTask task = new PageAsyncTask(
                new BeginEventHandler(BeginAsyncOperation),
                new EndEventHandler(EndAsyncOperation),
                new EndEventHandler(TimeoutAsyncOperation),
                null
            );

            PageAsyncTask task1 = new PageAsyncTask(
                new BeginEventHandler(BeginAsyncOperation1),
                new EndEventHandler(EndAsyncOperation1),
                new EndEventHandler(TimeoutAsyncOperation1),
                null
            );

            RegisterAsyncTask(task);
            RegisterAsyncTask(task1);
        }
    }
        如果在頁面屬性AsyncTimeout的規定時間內得到非同步任務返回的結果,那麼頁面將按照我們預期的顯示。但是如果在執行第一個任務時遇到了小麻煩,耽誤了時間會怎麼樣呢?有兩種可能:一是,第一個任務的結果最終返回並顯示出來,而第二個任務剛一啟動就被判定為逾時,從而執行了它的TimeoutAsyncOperation方法;二是,第一個任務沒有等到返回結果就已被判逾時,因此第二個任務也一定被判逾時了。以上情況是由於兩個非同步任務分享了AsyncTimeout規定的時間,只要前面那個任務在執行時耽誤了時間,必然影響到後面那個任務的運行。那麼能不能讓兩個非同步任務獨享AsyncTimeout規定的時間呢,這就要在ExecuteRegisteredAsyncTasks方法上找出路了。
        值得注意的是,每次調用ExecuteRegisteredAsyncTasks時,Asp.net2.0都將重設AsyncTimeout屬性,這意味著有可能實現非同步任務獨享AsyncTimeout規定的時間。按照目前程式的寫法,如果不顯示調用ExecuteRegisteredAsyncTasks方法,Asp.net2.0會在頁面生命週期中的PreRenderComplete
事件之前自動調用ExecuteRegisteredAsyncTasks方法來運行這兩個註冊的非同步任務。因為只執行了一次ExecuteRegisteredAsyncTasks卻運行了兩個任務,那麼這兩個任務便只好分享AsyncTimeout規定的已耗用時間了。於是我對代碼做了如下調整:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            PageAsyncTask task = new PageAsyncTask(
                new BeginEventHandler(BeginAsyncOperation),
                new EndEventHandler(EndAsyncOperation),
                new EndEventHandler(TimeoutAsyncOperation),
                null
            );

            PageAsyncTask task1 = new PageAsyncTask(
                new BeginEventHandler(BeginAsyncOperation1),
                new EndEventHandler(EndAsyncOperation1),
                new EndEventHandler(TimeoutAsyncOperation1),
                null
            );

            RegisterAsyncTask(task);
            ExecuteRegisteredAsyncTasks();
            RegisterAsyncTask(task1);
            ExecuteRegisteredAsyncTasks();
        }
    }
        乍一看似乎有點問題:第二個ExecuteRegisteredAsyncTasks方法會不會將註冊的第一個非同步任務又執行一次?其實不會的,因為Asp.net2.0已經規定同一個非同步方法呼叫只會執行一次。因此這樣就使兩個非同步任務獨享了已耗用時間,避免了互相干擾。 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/JOHNCOOLS/articles/1467373.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.