7

私のアプリケーションには、スレッドローカルストレージを使用することで満たすことができると思う要件がありますが、それが避けるのが最善の方法の1つであるかどうか疑問に思っています。

私はこの主題に関するいくつかの記事を読みました:

http://www.dotnetcoders.com/web/Articles/ShowArticle.aspx?article=58

http://msdn.microsoft.com/en-us/library/system.threadstaticattribute(vs.80).aspx

私はそれを使う方法を知っています、私はそれを使うべきかどうか疑問に思っています。

何かアドバイス、知っておくべきことはありますか?

[編集]

ユースケースは次のとおりです。

私は、各クエリについて多くのログを記録するいくつかのメソッドを介してすべてのデータアクセスを集中させます。ログに記録するのは、コマンドが入力されたコマンドテキストの完全なダンプです。これにより、トレースログから直接SqlManagementStudioにコピーアンドペーストできます。

Webアプリのglobal.asaxで、未処理の例外が発生したときに、できるだけ多くの情報を記載したメールを管理者に送信します。SqlExceptionが発生したときに、そのsqlコマンドダンプテキストをこの電子メールに入れたいと思います。これにより、クエリが原因でページが爆発したときにトレースログを調べる時間を節約できます。

データアクセスクラスのメソッドシグネチャを変更したくないのは、例外が発生したときに参照を取得するために、スタックの最後まで参照を渡すことができるようにするためです。TLSは「lastsqlcommand」のようなものを置くのに良い場所かもしれないと思っていましたが、それは実行可能な解決策のようには見えません。

4

3 に答える 3

7

asp.net アプリケーションの落とし穴: 単一の要求の処理がスレッドを切り替える可能性があります。つまり、同じセッションに並列要求がある場合です。このため、別のスレッド上にいるため、HttpApplication.PostRequireRequestState イベントの前に TLS に入れたものは後で存在しない可能性があります。

[質問者による編集]

私の特定のユース ケースでは、キーと値のペアを SqlException.Data ディクショナリに追加し、例外の詳細をログに記録するときに取得しました。これにより、スレッド ローカル ストレージを使用したいと思っていた機能が得られます。

于 2008-10-06T16:53:41.417 に答える
6

スレッド ローカル ストレージは、スレッドの前に設計され、多くのグローバル変数と静的変数を使用するライブラリを修正する簡単な方法です。これは、インターフェイスを変更せずに C 標準ライブラリをスレッドセーフにした方法です (内部的には、多くの関数が静的バッファーを使用します)。

一般的に、それはその目的に適しています。マルチスレッド環境でグローバル データが必要な場合は、スレッド ローカル ストレージが適しています。一般的な理由は、同じスタックフレームでコールバックするが、追加情報を渡すためのフックを提供しないサードパーティ関数を呼び出していることです。これは、古い C ライブラリをラップするときによく発生します。 。ネット。

于 2008-10-06T17:26:28.010 に答える
0

新しい .net 4 ThreadLocal<T>クラスを例とともに見てください。詳細はこちら.

于 2012-02-29T10:32:41.933 に答える