Если у вас есть несколько потоков, обращающихся к Словарю, вам нужно заблокировать обновления и поиск.Причина, по которой вам нужно заблокировать поиск, заключается в том, что обновление может происходить в то же время, когда вы выполняете поиск, а Словарь может находиться в несовместимом состоянии во время обновления.Например, представьте, что у вас есть один поток, который делает это:
if (myDictionary.TryGetValue(key, out value))
{
}
, а отдельный поток делает это:
myDictionary.Remove(key);
Что может случиться, если поток выполняет TryGetValue
определяет, что элемент находится в словаре, но прежде чем он сможет извлечь элемент, другой поток удаляет его.В результате поток, выполняющий поиск, либо выдаст исключение, либо TryGetValue
вернет true
, но value
будет null
или, возможно, объектом, не соответствующим ключу.
Это только одна вещь, которая может случиться.Нечто подобное может иметь катастрофические последствия, если вы выполняете поиск в одном потоке, а другой поток добавляет значение, которое вы пытаетесь найти.