В моем коде у меня есть объект статического словаря
private static IDictionary< ConnKey, DbConnection > ConnectionList = new Dictionary< ConnKey, DbConnection >( );
который выбрасывает эту ошибку
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
Я искал и обнаружил, что это происходит, потому что несколько потоков пытаются получить доступ к словарю, но у меня есть lock
в словаре
lock( ConnectionList ) {
ConnectionList.Add( key, res );
}
Затем я искал больше и обнаружил, что блокировка словаря не предотвращает все операции над ним, поэтому я должен использовать объект lock
on SyncRoot
для этого, чтобы добиться того, что хочу
lock( ((IDictionary)ConnectionList).SyncRoot) {
Но потом я искал, что использование SyncRoot
не является хорошей практикой
При дальнейшем поиске я обнаружил, что для этого существует ConcurrentDictionary
- Так может кто-нибудь, пожалуйста, предложите мне, который является лучшим способом блокировки словаря.
- Если я использую
ConcurrentDictionary
, мне все равно нужно использоватьlock
на нем или он сам будет обрабатывать все. - Если мне нужно использовать lock на
ConcurrentDictionary
, я должен использоватьlock
на нем напрямую или снова, мне нужно заблокировать объектSyncRoot
для него
Спасибо заранее!