4

lock()コードでステートメントを使用する方法がわかりません。次のような静的コレクションがいくつかあります。

private static Dictionary<string, User>() Users = new Dictionary<string, User>();

私は常にこのコレクションに追加、削除、更新、および読み取りを行っています。追加、削除、または更新するときは をロックする必要がありますUsersが、コレクションから読み取るときはロックする必要がありますか? Userキーを検索して辞書で返すなどの正しい方法は何ですか? 新しいDictionaryインスタンスを作成し、そこにユーザーをコピーしてから読み取ることを考えていましたか、それとも直接読み取ることができますか?

4

4 に答える 4

4

ここでの最良のオプションは、ロックを削除し、のConcurrentDictionary<string, User>代わりにを使用することDictionary<string, User>です。

それ以外の場合は、読み取りも同期する必要があります。複数のスレッドから読み取ることができますが、リーダーが読み取っているときにライターが辞書に書き込む場合は、同期が必要です。 ReaderWriterLock(またはReaderWriterLockSlim)このシナリオでは、複数のリーダーを許可できますが、ライターは1つだけであるため、うまく機能します。シンプルlockでも機能しますが、必要以上に頻繁にブロックされます。

于 2012-08-30T20:24:09.863 に答える
3

しかし、コレクションから読み取るとき、それをロックする必要がありますか?

はい、読み取り中に別のスレッドが辞書を変更する可能性がある場合は可能です。

キーを検索してユーザーを辞書に戻すなどの正しい方法は何ですか?

TryGetValueメソッドを使用します。

.Net 4.0以降を使用している場合は、スレッドセーフなConcurrentDictionaryコレクションを使用できます。

于 2012-08-30T20:24:02.687 に答える
2

C# 4.0以上を使用している場合は、それらすべてを処理するConcurentDictionaryを使用できます。

4.0何らかの理由で使用できない、または使用できない場合は、はいRead、ロックメカニズムWriteを自分で実装Containsする必要があります。

  • 一貫性
  • Isoltaion
  • 耐久性。

この場合、 Atomicityが多くの取引をしているとは思わないでください。

お役に立てれば。

于 2012-08-30T20:23:59.817 に答える
0

ConcurrentDictionaryを使用できます

LIink: http: //msdn.microsoft.com/en-us/library/dd287191.aspx

于 2012-08-30T20:24:57.643 に答える