首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 2.0 多任務非同步頁面實作指南

     編輯:關於ASP.NET

ASP.NET 2.0 提供三種非同步頁面程式模型,功能層層遞進。本文聚焦最強大的 PageAsyncTask + RegisterAsyncTask + ExecuteRegisteredAsyncTasks 模式,並解決多任務共享逾時時間的問題。

基本模式:註冊並執行多個非同步任務

在頁面指示詞設定 Async="true" AsyncTimeout="5",於 Page_Load 註冊任務:

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

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

        RegisterAsyncTask(task1);
        RegisterAsyncTask(task2);
    }
}

問題:多任務共享單一逾時計數器

ASP.NET 會在 PreRenderComplete 事件前自動呼叫 ExecuteRegisteredAsyncTasks() 一次執行所有已註冊任務。若第一個任務耗時過長,第二個任務可能剛啟動就被判定逾時,導致非預期的逾時處理。

解決方案:分別呼叫 ExecuteRegisteredAsyncTasks

手動在註冊每個任務後立即呼叫 ExecuteRegisteredAsyncTasks(),ASP.NET 會重設逾時計數器,使每個任務獨享 AsyncTimeout 指定的時間:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        var task1 = new PageAsyncTask(...);
        RegisterAsyncTask(task1);
        ExecuteRegisteredAsyncTasks(); // 任務 1 獨享逾時時間

        var task2 = new PageAsyncTask(...);
        RegisterAsyncTask(task2);
        ExecuteRegisteredAsyncTasks(); // 任務 2 獨享逾時時間
    }
}

注意:ASP.NET 保證同一個非同步方法只會執行一次,因此第二次呼叫不會重複執行第一個任務。

完整程式碼結構

<%@ Page Async="true" AsyncTimeout="5" Language="C#" %>
<script runat="server">
    // BeginAsyncOperation, EndAsyncOperation, TimeoutAsyncOperation 等方法實作
</script>

總結

透過分散呼叫 ExecuteRegisteredAsyncTasks,即可實現多非同步任務獨立逾時控制,提升頁面回應可靠度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved