Asp.Net2.0 の非同期ページ テクノロジを学びたい場合は、 http://www.microsoft.com/china/MSDN/library/default.mspx?mfr=true を注意深く読み、そのソース コードと注意深く勉強してください。全文では、非同期ページを実装するための合計 3 つのプログラミング モデルが紹介されており、それぞれが他よりも強力な機能を備えています。これ以上は言いません。最後のモデルを見てみましょう。PageAsyncTask クラス、RegisterAsyncTask メソッド、ExecuteRegisteredAsyncTasks メソッド、および TimeoutAsyncOperation メソッドを使用して、非同期タスクを登録して実行し、長時間応答がない場合はタイムアウト処理メソッドを呼び出します。元の記事で提供されているソース コードの AsyncPageTask.aspx.cs ファイルには、このモデルを使用して非同期ページを実装する方法の詳細な例が示されています。
このモデルの最大の利点は、1 つのページ リクエストで複数の非同期タスクを処理できることです。また、タイムアウト処理を使用して、非同期操作を実行する際の無応答を回避することもできます。元の作成者は Page_Load に非同期タスクを登録しただけなので、彼の例に従って、以下に示すように別の非同期タスクを登録します。
<%@ Page Async="true" AsyncTimeout="5" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="AsyncPageTask.aspx.cs" Inherits="AsyncPageTask" Title="無題のページ" %>
protected void Page_Load(オブジェクト送信者, EventArgs e)
{
if (!IsPostBack)
{
PageAsyncTask タスク = new PageAsyncTask(
新しい BeginEventHandler(BeginAsyncOperation)、
新しい EndEventHandler(EndAsyncOperation)、
新しい EndEventHandler(TimeoutAsyncOperation)、
ヌル
);
PageAsyncTask task1 = 新しい PageAsyncTask(
新しい BeginEventHandler(BeginAsyncOperation1)、
新しい EndEventHandler(EndAsyncOperation1)、
新しい EndEventHandler(TimeoutAsyncOperation1)、
ヌル
);
RegisterAsyncTask(タスク);
RegisterAsyncTask(タスク1);
}
}
非同期タスクによって返された結果が、ページ属性 AsyncTimeout の指定時間内に取得された場合、ページは期待どおりに表示されます。しかし、最初のタスクを実行中にちょっとしたトラブルに遭遇し、時間をロスしたらどうなるでしょうか? 2 つの可能性があります。1 つ目は、最初のタスクの結果が最終的に返されて表示され、2 つ目のタスクは開始されるとすぐにタイムアウトしたと判断され、その TimeoutAsyncOperation メソッドが実行されます。2 つ目は、最初のタスクがタイムアウトしないことです。結果が返されるまでにタイムアウトが宣告されているため、2 番目のタスクもタイムアウトを宣告されているはずです。上記の状況は、2 つの非同期タスクが AsyncTimeout で指定された時間を共有しているために発生します。前のタスクの実行が遅れると、必ず後続のタスクの動作に影響を及ぼします。では、2 つの非同期タスクは、AsyncTimeout で指定された時間に排他的にアクセスできますか? これには、ExecuteRegisteredAsyncTasks メソッドを使用する方法を見つける必要があります。
Asp.net2.0 は ExecuteRegisteredAsyncTasks が呼び出されるたびに AsyncTimeout プロパティをリセットすることに注意してください。これは、AsyncTimeout で指定された時間だけ非同期タスクを実行できることを意味します。現在のプログラムの記述方法によれば、ExecuteRegisteredAsyncTasks メソッドが明示的に呼び出されない場合、Asp.net2.0 はページのライフ サイクルで PreRenderComplete を呼び出します。
ExecuteRegisteredAsyncTasks メソッドは、登録された 2 つの非同期タスクを実行するイベントの前に自動的に呼び出されます。 ExecuteRegisteredAsyncTasks は 1 回しか実行されませんが、2 つのタスクが実行されるため、2 つのタスクは AsyncTimeout で指定された実行時間を共有する必要があります。そこで、コードに次の調整を加えました。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
PageAsyncTask タスク = new PageAsyncTask(
新しい BeginEventHandler(BeginAsyncOperation)、
新しい EndEventHandler(EndAsyncOperation)、
新しい EndEventHandler(TimeoutAsyncOperation)、
ヌル
);
PageAsyncTask task1 = 新しい PageAsyncTask(
新しい BeginEventHandler(BeginAsyncOperation1)、
新しい EndEventHandler(EndAsyncOperation1)、
新しい EndEventHandler(TimeoutAsyncOperation1)、
ヌル
);
RegisterAsyncTask(タスク);
ExecuteRegisteredAsyncTasks();
RegisterAsyncTask(タスク1);
ExecuteRegisteredAsyncTasks();
}
}
一見すると、問題があるように見えます。2 番目の ExecuteRegisteredAsyncTasks メソッドは、最初に登録された非同期タスクを再度実行しますか?実際にはいいえ、Asp.net2.0 では同じ非同期メソッドが 1 回だけ実行されると規定されているためです。したがって、2 つの非同期タスクには排他的な実行時間があり、相互干渉が回避されます。
http://www.cnblogs.com/taewind/archive/2006/12/22/600687.html