HTTP リスナーを使用して作成している HTTP サーバーがあり、特定の変数をスレッド内のどこからでもアクセスできるように宣言したいと考えています。
- 私の Web サーバー クラスはインスタンス化されているため、実際には静的変数を使用できません。
- すべてのコードが 1 つのクラスにあるため、インスタンス変数を使用できますが、わかりません。
Dictionary: を使用することを考えDictionary</*[type of Thread ID here]*/,ThreadData>
ましたが、スレッドの問題があるのではないかと心配しています。おそらくThreadData
クラス インスタンスになりますが、より効率的な構造体を使用する可能性があります。
- ディクショナリをスレッド ID にキー設定し、1 つのスレッドがディクショナリ内の独自のエントリのみを要求するようにプログラムすると、ディクショナリにアクセスするときにスレッド関連の問題が発生しますか?
- 各スレッドは独自のエントリを追加します。新しいスレッド アイテムを追加する間、辞書をロックする必要がありますか? もしそうなら、別のロックオブジェクトを使用して、その間スレッドが自分のデータにアクセスできるようにすることはできますか?
並行辞書を使用する利点はありますか? よりスレッドセーフな別の方法はありますか?
私は現在使用してThreadPool.QueueUserWorkItem
います。これがアイテムごとに新しいスレッドを使用するかどうかはわかりません。そうでない場合は、コンテキストにキーを設定することもできます。
更新: ThreadPool クラス - MSDNによると、スレッドを再利用します。また、スレッドデータはクリアされません。
スレッド プールがスレッドを再利用する場合、スレッド ローカル ストレージまたは ThreadStaticAttribute 属性でマークされたフィールドのデータは消去されません。したがって、メソッドが ThreadStaticAttribute 属性でマークされたスレッド ローカル ストレージまたはフィールドを調べる場合、メソッドが検出した値は、スレッド プール スレッドの以前の使用から残っている可能性があります。