Не зная больше о том, что вы делаете в замке, тогда невозможно сказать.
Например, если весь ваш доступ к словарю выглядит так:
lock(lockObject)
{
foo = dict[key];
}
... // elsewhere
lock(lockObject)
{
dict[key] = foo;
}
Тогда все будет хорошо, если вы отключите его (хотя вы, скорее всего, не увидите никакой разницы в производительности, поэтому, если она не сломалась, не исправляйте ее). Однако, если вы делаете что-то необычное в блоке блокировки, где вы взаимодействуете со словарем, вам нужно убедиться, что в словаре предусмотрена функция single , которая может выполнить то, что вы делаете внутри блокировка блока, в противном случае вы получите код, который функционально отличается от того, что вы имели раньше. Самая важная вещь, которую нужно помнить, - это то, что словарь гарантирует, что одновременные вызовы словаря выполняются последовательно; он не может обрабатывать случаи, когда у вас есть одно действие в вашем коде, которое многократно взаимодействует со словарем. В таких случаях, когда ConcurrentDictionary
не учитывается, требуется собственный контроль параллелизма.
К счастью, ConcurrentDictionary
предоставляет некоторые вспомогательные функции для более распространенных многошаговых операций, таких как AddOrUpdate
или GetOrAdd
, но они не могут охватить все обстоятельства. Если вам придется работать с логикой в этих функциях, возможно, лучше справиться с собственным параллелизмом.