私はHTTPリスナーを使って書いているHTTPサーバを持っています。スレッド内のどこからでもアクセスできるものとして何らかの変数を宣言したいと思います。スレッド内でグローバル変数を設定する - C#
- Webサーバークラスはインスタンスベースであるため、静的変数は実際には使用できません。
- すべてのコードが1つのクラスに含まれているため、インスタンス変数を使用できますが...わかりません。
私は辞書を使用すると思った:Dictionary</*[type of Thread ID here]*/,ThreadData>
しかし、私はスレッドの問題がある可能性があります。 ThreadData
は、おそらくはクラスインスタンスになりますが、効率的なものに応じて構造体を使用することがあります。
- つのスレッドがのみ辞書に独自のエントリのために頼むように辞書にアクセスするとき、私は、任意のスレッド関連の問題があるだろうスレッドIDとプログラムそれに辞書をキーイングでしょうか?
- 各スレッドは独自のエントリを追加します。新しいスレッド項目を追加しているときに辞書をロックする必要がありますか?もしそうなら、別のロックオブジェクトを使用して、スレッドがその間に自分のデータにアクセスできるようにすることができますか?
同時並行辞書を使用する利点はありますか?スレッドセーフな方法がありますか?
私は現在ThreadPool.QueueUserWorkItem
を使用しています。私は、これが各項目に新しいスレッドを使用しているかどうかはわかりません。そうでなければ、私はそれをコンテキストに合わせることもできます。
更新:ThreadPool class - MSDNによれば、スレッドを再利用します。そして、スレッドデータをクリアしません。
スレッドプールがスレッドを再利用する場合、スレッドローカルストレージまたはThreadStaticAttribute属性でマークされたフィールドのデータはクリアされません。したがって、ThreadStaticAttribute属性でマークされたスレッドローカルストレージまたはフィールドを調べるメソッドは、スレッドプールスレッドの以前の使用から残っている可能性があります。
考えるあなたは[BackgroundWorkerの](http://msdn.microsoft.com/en-をサブクラス化しようとしたことがありus/library/system.componentmodel.backgroundworker.aspx)クラス? – Romoku
ワーカースレッドのエントリポイントが異なり、ワーカーロジックを自分で作成するため、古いスレッドデータを消去することは問題ではありません。 – Gene