Я могу ответить на этот вопрос напрямую, так как я написал этот словарь:)
Получив перечислитель в словаре, вы получите ссылку на внутренние наборы KVP. Вам придется удерживать блокировку чтения до тех пор, пока вы не закончите перечисление, что может занять много времени.
Причина, по которой я говорю перечислять ключи или значения, заключается в том, что я копирую список ключей и значений при его запросе, поэтому я не возвращаю ссылку на внутренний список словарей, который если вы изменили без блокировки, может вызвать проблемы. Хотя, я полагаю, вы могли бы реализовать тот же шаблон на KVP, если хотите, поскольку они доступны только для чтения.
public virtual ICollection<TKey> Keys
{
get
{
using (new ReadOnlyLock(this.dictionaryLock))
{
return new List<TKey>(this.dict.Keys);
}
}
}
public virtual ICollection<TValue> Values
{
get
{
using (new ReadOnlyLock(this.dictionaryLock))
{
return new List<TValue>(this.dict.Values);
}
}
}