The documentation of ConcurrentDictionary doesn’t explicit state, so I guess we cannot expect that delegates valueFactory and updateValueFactory have their execution synchronized (from GetOrAdd() and AddOrUpdate() operations respectively).
So, I think we cannot implement use of resources inside them which need concurrent control without manually implementing our own concurrent control, maybe just using [MethodImpl(MethodImplOptions.Synchronized)] over the delegates.
Am I right? Or the fact that ConcurrentDictionary is thread-safe we can expect that calls to these delegates are automatically synchronized (thread-safe too)?
Yes, you are right, the user delegates are not synchronized by
ConcurrentDictionary. If you need those synchronized it is your responsibility.The MSDN itself says:
See “How to: Add and Remove Items from a ConcurrentDictionary
This is because the
ConcurrentDictionaryhas no idea what the delegate you provide will do or its performance, so if it attempted lock around them, it could really impact performance negatively and ruin the value of the ConcurrentDictionary.Thus, it is the user’s responsibility to synchronize their delegate if that is necessary. The MSDN link above actually has a good example of the guarantees it does and does not make.