Hashtable to Dictionary <> syncroot.

У Hashtables есть свойство syncroot, но общие словари этого не делают. Если у меня есть код, который делает это:

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

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

Ответ 1

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

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

Ответ 2

Новое мышление 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.
}

Ответ 3

var dictionary = new Dictionary<int, string>();

lock(((ICollection) dictionary).SyncRoot)
{
    // ...
}

Ответ 4

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