#c# #concurrent-collections
#c# #параллельные коллекции
Вопрос:
В параллельном словаре C #, в частности, подпись . . .
public TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory)
. . . Я знаю, что valueFactory можно вызывать несколько раз. Однако что происходит с несколькими возвращаемыми значениями? Гарантируется ли, что в словаре будет отображен только один результат, или есть какая-либо вероятность, что существует окно, в котором другие потоки могут видеть разные значения в словаре?
Ответ №1:
При просмотре в reflector valueFactory выполняется только из-за внутреннего метода, который принимает значение, а не делегат. После этого, как я понимаю, это выглядит так, как если бы вы вызвали перегрузку reguler, которая принимает значение, а не делегат.
таким образом, по сути, значение от делегата игнорируется и не отображается в словаре. Значение в словаре всегда одно и то же, и поэтому потоки всегда видят одно и то же значение (потому что при использовании GetOrAdd всегда отображается только одно значение).
Очевидно, что если вы измените значение с помощью AddOrUpdate, значения будут обновлены.