2012-02-23 6 views

答えて

3

統合パイプラインモードで実行しているときの正確な動作はわかりませんが、非統合のケースでは何が表示されているのかは分かりますが、セマンティクスは変わらないはずです。

簡単な答えは、各イベントハンドラが同期または非同期のいずれかで連続して起動され、前のイベントハンドラが完了するまで次のイベントハンドラが起動されないことです。

これはソースコードからトレースできます。

リクエストが入ってキューに格納されます。通常、HttpRuntimeがリクエストをデキューすると、メソッドを呼び出すことによって、要求としてHttpApplicationが初期化され、HttpContextが引数として渡されます。

HttpApplication.InitInternalは、非統合モードの場合に新しいHttpApplication.ApplicationStepManagerクラスを初期化します。これで、BuildStepsメソッドが呼び出されていることがわかります。これにより、ステップを格納するArrayListが作成され、すべてのステップが構築され、保管されます。具体的には、これらのステップはIExecuteStepインターフェイスの実装です。最終的に、すべてのステップが追加されると、リストは配列にコピーされ、後でメンバに保存されて確定されます。var _execSteps

手順のソースはいくつかありますが、最もよく使用されるのはイベントタイプ(begin request、authorizeなど)とstepsアレイのイベントのステップを追加するHttpApplication.CreateEventExecutionStepsです。 CreateEventExecutionStepsにドリルすると、AsyncEventsEventsの表から、それぞれが知っている非同期と同期のハンドラごとにIExecuteStepが追加されています。 IExecuteStepインターフェイス自体は、基本的にExecuteメソッドとCompletedSynchronouslyフラグで構成されています。

ここで言及したようなAddメソッドの1つであるAddOnEndRequestAsyncを一時停止して調べてみると、非同期ハンドラに関する情報をAsyncEventsテーブルに追加することができます。 CreateEventExecutionStepsはこのテーブルを歩き、追加されたハンドラごとにAsyncEventExecutionStepが作成されます。

リクエストフローに戻る。 HttpRuntimeが要求のためにを初期化した後、BeginProcessRequestメソッドを呼び出します。このメソッドはResumeStepsを呼び出します。

ResumeStepsは、ステップがどのように使用され、どのような待機戦略が非同期の場合にあるかを見ることができる重要なものです。実行ステップの配列に_currentStepIndexを維持していることがわかります。最終的には配列から次のステップを取得し、Executeメソッドを呼び出していることがわかります。ステップで実行がCompletedSynchronouslyであると報告されると、ループして再び実行されます。そうでなければ、メソッドが完了して非同期の深淵に入ります。

この非同期のケースで何が起こるかを見るには、非同期ハンドラのために作成されたAsyncEventExecutionStepの実装を参照する必要があります。 Executeの実装では、beginハンドラを起動し、完了コールバックを渡すことがわかります。コンストラクタでは、このコールバックが最終的に... HttpApplication.ResumeStepsを呼び出すメソッドに初期化されています。

そして、アレイがオーバーランして要求処理を「終了」するまで、ステップ、同期または非同期を実行し続けます。

重要なことは、追加するイベントハンドラに変換されるステップが1つずつ実行され、同期または非同期のいずれであっても、現在のステップが完了するまで次のステップが実行されないことです。あなたの質問は、イベントがこのように1つずつ処理されるかどうかでしたが、わかるように、各イベントハンドラがこのように処理されるため、実際はもっと細かくなり、それぞれがHttpContextへの同期アクセスを取得し、彼らがまだパイプラインの「正しい段階」にあるかどうかについて心配している。

明らかにそのソースコードには、yada yadaという他の詳細がありますが、これは要点です。

関連する問題