質問

msdnのドキュメントを読む辞書に記載されているもの:<!>この型のパブリックstatic(Visual BasicではShared)メンバーはスレッドセーフです。インスタンスメンバーはスレッドセーフであるとは限りません。<!> quot;

これは、次のような辞書を使用していることを意味します:


static object syncObject = new object();
static Dictionary<string,MyObject> mydictionary= new Dictionary<string, MyObject>();

以下のコードのようなことは不要ですか?


lock (syncObject)
{
   context = new TDataContext();
   mydictionary.Add("key", myObject);
}
役に立ちましたか?

解決

クラス自体の静的メソッドを参照しています。このステートメントは、実際にはほとんどのクラスに追加される定型的なドキュメントです。辞書<!> lt; <!> gt;クラスは実際には静的メソッドを公開しません。

lockキーワードまたは場合によってはReaderWriterLockを使用して、辞書クラスへのアクセスを自分でシリアル化する必要があります。ただし、スレッド化は非常に複雑なトピックであり、lockキーワードは常に適切とは限りません。 Joe Duffyによる素晴らしい本があります<!> quot; Windowsでの同時プログラミング < !> quot;これは、共有アプリケーションリソースの保護について深く掘り下げます。

他のヒント

このタイプの<!> quot; public static members を誤って解釈しています<!> quot;このタイプの<!> quot; public static インスタンスとして<!> quot;。

Addメソッド(インスタンスメソッド)を呼び出す場合は、独自のロックまたはシリアル化セマンティクスを使用して、Dictionaryへの排他的アクセスを確保することをお勧めします。 2つのスレッドが同時にディクショナリの状態を変更している場合、問題が発生する可能性があります。これが発生しないようにするのはユーザーの責任です。 DictionaryのAddメソッドには、このロックを行うものは何もありません。

ただし、Dictionaryの静的メソッド(有用なメソッドがない)を呼び出すと、ロックがなくても問題ありません。

これは、BCLのすべての.NETタイプの一般的なルールです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top