ハッシュテーブルには syncroot プロパティがありますが、一般的な辞書にはありません。これを行うコードがある場合:
lock (hashtable.Syncroot)
{
....
}
ハッシュテーブルを削除して汎用辞書に変更する場合、これを複製するにはどうすればよいですか?
ハッシュテーブルには syncroot プロパティがありますが、一般的な辞書にはありません。これを行うコードがある場合:
lock (hashtable.Syncroot)
{
....
}
ハッシュテーブルを削除して汎用辞書に変更する場合、これを複製するにはどうすればよいですか?
厳密に互換性を求めるなら、Bryan は正しいです。これは、ディクショナリの上に現在のセマンティクスを維持するための最良の方法です。
しかし、それを拡張します。SyncRoot プロパティがジェネリック ディクショナリに直接追加されなかった理由は、同期を行うのに危険な方法だからです。これは、非常に危険でデッドロックを起こしやすい "lock(this)" よりもわずかに優れています。これがなぜ悪いのかを説明するいくつかのリンクがあります。
SyncRoot の背後にある新しい考え方は、元の設計に誤りがあったというものです。ロックするのがディクショナリだけで、それがプライベートである場合は、ディクショナリまたは同期オブジェクトとして機能する別のオブジェクトをロックできます。後者の手法は、保護している状態が辞書以上のものである場合に役立ちます。
// used as you would have used SyncRoot before
object _syncLock = new object();
Dictionary<string, int> numberMapper = new Dictionary<string, int>();
// in some method...
lock (_syncLock)
{
// use the dictionary here.
}
var dictionary = new Dictionary<int, string>();
lock(((ICollection) dictionary).SyncRoot)
{
// ...
}
ハッシュテーブル/辞書が公開されていない場合は、辞書オブジェクト自体をロックできます。