2012-07-03 14 views
9

私はHttpContextとCallContextについての記事を読んでいて、スレッドの敏捷性を見ています。 それはどういう意味ですか?ASP.Netのスレッド敏捷性の意味は何ですか?

+0

[ASP.NETはどのようにマルチスレッド化されていますか?](http://stackoverflow.com/questions/657735/how-is-asp-net-multithreaded) –

+2

スレッドアジリティは、基本的に要求が行われているスレッドを意味します。要求の実行中に処理される可能性があります。 – Nico

+1

このリンクのとおりhttp://blog.idm.fr/2010/03/aspnet-thread-agility-or-why-threadstatic-should-not-be-used.html ASP.Netでは、コンテナがうまくいく可能性があります要求の処理の途中でスレッドを切り替えることを決定する。これはスレッドの敏捷性と呼ばれます。 – HatSoft

答えて

11

つまり、IISは複数のスレッドを使用して1つの要求を処理できますが、並列ではありません。

基本的に、IISはI/O操作を非同期的に実行しようとするため、操作中に呼び出しスレッドが解放されます。そのスレッドはプールに戻され、その間に他の要求を処理するために使用できます。

非同期入出力操作が完了すると、要求を元々処理していたスレッド以外のスレッドに制御を戻すことができます(そのスレッドは別の場所でビジー状態になることがあります)ので、要求はできるだけ早く処理され続けます。

+2

これはわずかな問題で、コードをランダムに中断することができます。たとえば、マイクロソフト自身の「パターンと実践」グループのEntLibデータアクセスブロックは、スレッドが変更された場合、開始したクエリとは異なるクエリへの応答を得るために、要求応答を混在させることがあります。これは少なくとも(EntLib v5.0では)修正されていましたが、実際には管理されたコードをサポートするはずのASP.NETにバグがあります。サードパーティライブラリの実装でこの機能またはFW/CLRの実装が使用されているかどうかを知る必要はありません。 –

+1

私はスレッドの敏捷性について難しいことを発見しました。 log4netを使用してリクエストプロパティをThreadContextに割り当てると、間違ったリクエストURL、ユーザ名、IPアドレスで記録されたログメッセージが表示されました。 [ASP.Netスレッドの敏捷性に関するlog4netコンテキストの問題](http://piers7.blogspot.nl/2005/12/log4net-context-problems-with-aspnet.html)を参照してください。 –

+0

はい、データを格納するためにThreadContextまたはCurrentPrincipalを使用することはできません。代わりに、HttpContext.ItemとHttpContext.Userをそれぞれ使用する必要があります。 –