Неясно, какие требования к параллелизму, памяти и производительности у вас действительно есть, поэтому вот несколько вариантов.
Если вы используете .Net 4.0, вы можете заменить Dictionary
на ConcurrentDictionary
и удалите свой ReaderWriterLockSlim
.Имейте в виду, что это уменьшит объем блокировки и изменит семантику методов, позволяя вносить изменения в содержимое во время перечисления (среди прочего), но с другой стороны, это даст вам поточный безопасный перечислитель, который не будет блокироватьчитает или пишет.Вам нужно будет определить, является ли это приемлемым изменением для вашей ситуации.
Если вам действительно нужно заблокировать всю коллекцию таким образом, возможно, вы сможете поддержать политику рекурсивной блокировки (new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion)
) если вы можете сохранить все операции в одном потоке.Является ли выполнение поиска параллельно необходимостью?
В качестве альтернативы, вы можете просто получить снимок текущего набора значений (блокируя эту операцию), а затем выполнить поиск по снимку.Не гарантируется наличие последних данных, и вам придется потратить немного времени на конверсию, но, возможно, это приемлемый компромисс для вашей ситуации.