21

static各スレッドの値を格納する必要があるコンポーネントがあります。これは、ASP.NETだけでなく、多くのシナリオで使用できる一般的なコンポーネントです。

私は[ThreadStatic]自分の目標を達成するために属性を使用することを考えていました。すべてのリクエストが独自のスレッドで呼び出されると想定していたため、ASP.NETシナリオでも正常に機能するとします。

調査の結果、ASP.NETで使用する場合は注意が必要だと言っているScottHanselmanのこのブログ投稿を見つけました。[ThreadStatic]

ただし、ほとんどのコメント(投稿の下)は、リクエストが常に1つのスレッドで実行され、スレッドが同時に別のリクエストによって使用されないというスコットの書き込みに同意しません。それも私が信じていることですが、ここであなたの専門家について意見を述べたいと思います。

4

2 に答える 2

32

いいえ、スコットは正しいです。リクエストは、その期間全体にわたって単一のスレッドで実行される必要はありません。ASP.NETは、その点でスレッドアジャイルです。切り替えが発生する可能性のあるポイントはごくわずかですが、確実に発生する可能性があります。(私はそれを自分でテストしました。)

詳細については、このブログ投稿このSpringフォーラムスレッドをお読みください。

基本的に、コンテキストをキャプチャする別の方法を見つける必要があります。あなたの観点からの関連するビットは、おそらくブログ投稿の最後にあります:

これは主要なPITAです。これは、私が見る限り、ASP.Netでの'ThreadStatic'風の動作の唯一の永続化オプションはHttpContextを使用することを意味するためです。したがって、ビジネスオブジェクトの場合、if(HttpContext.Current!= null)とSystem.Web参照(yuck)に固執するか、静的永続性のためのある種のプロバイダーモデルを考え出す必要があります。これらのシングルトンのいずれかにアクセスする前に設定する必要があります。ダブルヤック。

于 2011-01-25T08:19:40.733 に答える
1

ASP.NET環境でスレッドローカルデータを使用するかどうかはわかりませんが、 .NET4.0にはThreadLocalクラスが付属しています。

于 2011-01-25T09:35:18.187 に答える