Hashtable для словаря <> syncroot. - PullRequest
       13

Hashtable для словаря <> syncroot.

11 голосов
/ 29 ноября 2008

Хеш-таблицы имеют свойство syncroot, а общие словари - нет. Если у меня есть код, который делает это:

lock (hashtable.Syncroot)
{
....
}

Как мне воспроизвести это, если я удаляю хеш-таблицу и перехожу на общие словари?

Ответы [ 4 ]

12 голосов
/ 29 ноября 2008

Если вы идете строго за совместимость, то Брайан прав. Это лучший способ сохранить текущую семантику поверх словаря.

Расширяя это, хотя. Причина, по которой свойство SyncRoot не было напрямую добавлено в общий словарь, заключается в том, что это опасный способ синхронизации. Это только немного лучше, чем «блокировка (это)», которая очень опасна и склонна к тупикам. Вот несколько ссылок, объясняющих, почему это плохо.

7 голосов
/ 29 ноября 2008

Новое мышление 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.
}
5 голосов
/ 29 ноября 2008
var dictionary = new Dictionary<int, string>();

lock(((ICollection) dictionary).SyncRoot)
{
    // ...
}
3 голосов
/ 29 ноября 2008

Если хеш-таблица / словарь не является общедоступной, вы можете просто заблокировать сам объект словаря.

...