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(),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,即可實現多非同步任務獨立逾時控制,提升頁面回應可靠度。