Что происходит с дополнительным возвращаемым значением, если GetOrAdd() ValueFactory вызывается несколько раз?

#c# #concurrent-collections

#c# #параллельные коллекции

Вопрос:

В параллельном словаре C #, в частности, подпись . . .

 public TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory)
  

. . . Я знаю, что valueFactory можно вызывать несколько раз. Однако что происходит с несколькими возвращаемыми значениями? Гарантируется ли, что в словаре будет отображен только один результат, или есть какая-либо вероятность, что существует окно, в котором другие потоки могут видеть разные значения в словаре?

Ответ №1:

При просмотре в reflector valueFactory выполняется только из-за внутреннего метода, который принимает значение, а не делегат. После этого, как я понимаю, это выглядит так, как если бы вы вызвали перегрузку reguler, которая принимает значение, а не делегат.

таким образом, по сути, значение от делегата игнорируется и не отображается в словаре. Значение в словаре всегда одно и то же, и поэтому потоки всегда видят одно и то же значение (потому что при использовании GetOrAdd всегда отображается только одно значение).

Очевидно, что если вы измените значение с помощью AddOrUpdate, значения будут обновлены.