2011-01-25 13 views
17

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

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

調査の結果、[ThreadStatic]をASP.NETで使用する場合、Scott Hanselmanのthis Blog Postが注意しているとわかりました。

しかし、Scott氏は、Requestは常に1つのスレッドで実行され、スレッドは別の要求で同時に使用されないと言っていることに同意しません。それは私が信じていることですが、ここであなたの専門家についての意見がありたいです。

答えて

28

いいえ、スコットは正しくです:要求は間違いなくではありませんは、その全期間にわたって単一のスレッドで実行する必要があります。 ASP.NETはその点でスレッドアジャイルです。スイッチが起こる点はわずかですが、間違いなくになります。 (自分でテストしました)

さらに詳しい情報については、this blog postthis Spring forum threadをお読みください。

基本的には、別の方法でコンテキストを取得する必要があります。あなたの視点からの関連ビットは、おそらくブログ記事の末尾にあります。

これはメジャーなPITAです。これは、「スレッドスタティック」のための唯一の永続性オプションがASP.NetはHttpContextを使用します。したがって、ビジネスオブジェクトの場合は、if(HttpContext.Current!= null)とSystem.Web参照(yuck)のどちらか、または静的永続性のための何らかの種類のプロバイダモデルが必要です。これらのシングルトンのいずれかにアクセスする前にセットアップを行う必要があります。二重。

+0

追加のリンクありがとうございます。非常に役立ちます! – gsharp

+0

このコンテキストでは、ASP.NETがスレッドプリンシパルをどのように処理していますか? 'global.asax'でサイトアクセスのプリンシパルを設定し、この主体を使ってクレームなどをチェックする方法で、スレッドが変更できるコンテキストでは、Asp.netはプリンシパルやスレッドカルチャをコピーしますか? –

+0

@ T.S:そうだと思いますが、私はASP.NETの専門家ではないので、詳細はわかりません。 –

1

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

+1

ヒントをお寄せいただきありがとうございます。そのクラスについて知りませんでした。しかし、それはジョーンが私が推測したのと同じ理由でうまくいかないかもしれない? – gsharp

関連する問題