2

ほとんどのリクエストは長時間実行されるI/Oバウンドリクエストであるため、AsyncControllerを使用する予定です。計画では、この処理をCLRスレッドにオフロードして、IISスレッドの最大数を解放して新しい着信要求を処理できるようにします。

これまでのところ、AsyncControllerの使用例はすべて、AsyncControllerの非同期アクションメソッド内から非同期で長時間実行されるI/Oバウンドプロセスを実行します。コントローラーの非同期アクションメソッドで並行して実行できる操作が2つ以上ある場合は、そうすることの価値を確認できます。

例: ASP.NETMVCで非同期コントローラーを使用する

そこでは、ニュースサービスを非同期で実行します。これは本当に必要ですか?そのアクションメソッドで実行する必要があるのがニュースサービスだけである場合、ニュースサービスを非同期で実行することは冗長に思えます。この場合、実行するI/Oプロセスが長くなります。アクションメソッドの非同期バージョン内から同期的に実行することはできませんか?AsyncControllerの非同期アクションメソッド内に入ると、作業はすでにCLRスレッドに渡されていませんか?

繰り返しになりますが、並行して実行できる作業がもっとたくさんある場合、非同期でさらにアクションを実行する方法がわかります。ただし、長いブロッキング操作は1つしかないため、コードを単純に保つことをお勧めします。

次に示すように、Task.Factory.StartNew()を使用した別の戦術も 確認しました。ASP.NETMVC2でのAsyncControllerの使用

不必要に冗長に見えるので、この方法でも実行しないことを強くお勧めします。

4

1 に答える 1

2

はい、あなたは正しいと思います。ドキュメントには、非同期アクションを初期化するための次の手順が記載されています。

  1. Webサーバーはスレッドプール(ワーカースレッド)からスレッドを取得し、着信要求を処理するようにスケジュールします。このワーカースレッドは非同期操作を開始します。

  2. ワーカースレッドはスレッドプールに戻され、別のWebリクエストを処理します。

ワーカースレッドは非同期操作を開始します(つまり、コードで実行する必要はありません)。引用する例での「余分な」非同期コードの使用は、andの使用を説明することを意味している可能性がありますAsyncManager.OutstandingOperations.IncrementDecrement非同期アクションが戻った場合でも、操作がまだ実行中であることをワーカープロセスに通知します)。

于 2012-09-22T02:41:39.910 に答える