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