У Hashtables есть свойство syncroot, но общие словари этого не делают. Если у меня есть код, который делает это:
lock (hashtable.Syncroot)
{
....
}
Как мне реплицировать это, если я удаляю хэш-таблицу и изменяю ее на общие словари?
У Hashtables есть свойство syncroot, но общие словари этого не делают. Если у меня есть код, который делает это:
lock (hashtable.Syncroot)
{
....
}
Как мне реплицировать это, если я удаляю хэш-таблицу и изменяю ее на общие словари?
Если вы решите пойти на совместимость, то Брайан прав. Это лучший способ сохранить текущую семантику поверх Словаря.
Расширение на нем, хотя. Причина, по которой свойство SyncRoot не было напрямую добавлено в общий словарь, заключается в том, что это опасный способ синхронизации. Это только немного лучше, чем "замок (это)", что очень опасно и подвержено тупикам. Вот несколько ссылок, которые говорят, почему это плохо.
Новое мышление 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)
{
// ...
}
Если хеш-таблица/словарь не является общедоступной, вы можете просто заблокировать сам словарь.