HttpApplication非同期イベント(例:AddOnEndRequestAsync
と友人を使用して登録されたイベント)は非同期ですか? IISは、特定のイベントが完了するまでに非同期イベントが発生するのを待ってから、次のイベントに移動するか、「失敗して忘れていますか?非同期HttpApplicationイベントは返されるまで待機しますか?
答えて
統合パイプラインモードで実行しているときの正確な動作はわかりませんが、非統合のケースでは何が表示されているのかは分かりますが、セマンティクスは変わらないはずです。
簡単な答えは、各イベントハンドラが同期または非同期のいずれかで連続して起動され、前のイベントハンドラが完了するまで次のイベントハンドラが起動されないことです。
これはソースコードからトレースできます。
リクエストが入ってキューに格納されます。通常、HttpRuntime
がリクエストをデキューすると、メソッドを呼び出すことによって、要求としてHttpApplication
が初期化され、HttpContext
が引数として渡されます。
HttpApplication.InitInternal
は、非統合モードの場合に新しいHttpApplication.ApplicationStepManager
クラスを初期化します。これで、BuildSteps
メソッドが呼び出されていることがわかります。これにより、ステップを格納するArrayList
が作成され、すべてのステップが構築され、保管されます。具体的には、これらのステップはIExecuteStep
インターフェイスの実装です。最終的に、すべてのステップが追加されると、リストは配列にコピーされ、後でメンバに保存されて確定されます。var _execSteps
。
手順のソースはいくつかありますが、最もよく使用されるのはイベントタイプ(begin request、authorizeなど)とstepsアレイのイベントのステップを追加するHttpApplication.CreateEventExecutionSteps
です。 CreateEventExecutionSteps
にドリルすると、AsyncEvents
とEvents
の表から、それぞれが知っている非同期と同期のハンドラごとに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という他の詳細がありますが、これは要点です。
- 1. 非同期/待機イベント
- 2. HttpClientで待機する非同期呼び出しは返されません
- 3. List.forEach()で非同期/待機します
- 4. 非同期非同期テストJavaScript関数を待機します
- 5. ネストされた非同期/待機ノードノード
- 6. NodeJs - 非同期/非同期/待機中
- 7. 非同期、非同期待機
- 8. 非同期メソッドが呼び出された同期メソッドを待機します
- 9. 非同期待機ボタンは常に同期的に実行されます。
- 10. NSNotificationCenterイベントは同期または非同期で受信されますか?
- 11. ノードのネストされた関数で非同期/待機しますか?
- 12. 非同期でHttpWebRequest.GetResponseAsyncで待機する
- 13. 非同期バージョンと同じ、何も返さない非同期待機関数ですか?
- 14. 非同期待機待ちではありません
- 15. 非同期/待機nodejs?
- 16. 非同期/待機のタイムアウト
- 17. Selenium IDEで非同期イベントを待つ
- 18. 'Task.Factory.StartNew'を使用した非同期wpfイベントは待機を待機しません
- 19. 非同期タスクが完了するまで待機する
- 20. 非同期/ Webブラウザまたはnode.jsで待機していますか?
- 21. Xamarin iOS:DidFinishedLaunchingWithOptionsで非同期/待機します
- 22. Node/ExpressとMongoDB:Model.create()で非同期/待機しています
- 23. javascript非同期/汎用ループで待機します
- 24. スレッドタイマーで非同期/待機しています
- 25. C#ブロック機能とイベント待ちトリガ。また、非同期IAsyncOperationを使用して
- 26. C#.NET非同期返される型を返します
- 27. 非同期タスクが終了するまでの待機方法
- 28. 機能の非同期待機
- 29. Google Cloudで非同期/待機中
- 30. 遅延非同期関数の待機(beforeunloadイベント)