用内部不可变字典构造不可变字典

Constructing immutable dictionary with inner immutable dictionary

我有以下字典并希望使其不可变;

var dict = ConcurrentDictionary<Type, ConcurrentDictionary<Type, Action>>

然后我打电话给

var immmutableDict = dict.ToImmutableDictionary();

然而,我相信这仍然会提供内部 ConcurrentDictionary<Type, Action> 字典。

如何使用现有函数以线程安全的方式制作整个字典的不可变副本,或者我是否需要锁定整个操作以确保原子转换?

ImmutableDictionary<Type, ImmutableDictionary<Type, Action>>

或者,如果上述方法不可行,我可以重构代码以从一开始就使用 ReadOnlyDictionary 字典,但是我面临与内部字典相同的挑战,使其在构建期间只读:

var dict2 = new Dictionary<Type, Dictionary<Type, InstanceProducer>>();
/* snip perform adds to above dictionary to initialise state */

var immutableDict = dict2.ReadOnlyDictionary(); // ????
// where ReadOnlyDictionary<Type, ReadOnlyDictionary<Type, InstanceProducer>>(); is returned
// i need to make the above immutable with an immutable internal dictionary

However this would still give the internal ConcurrentDictionary<Type, Action> dictionary i believe.

通话中:

var immmutableDict = dict.ToImmutableDictionary();

将创建类型的结果:ImutableDictionary<Type, ConcurrentDictionary<Type, Action>,因此它不会是 ConcurrentDictionary

How can i make an immutable copy of the entire dictionary in a thread safe fashion with existing functions, or would i need to lock the entire operation to ensure atomic conversion?

要了解 dict.ToImmutableDictionary() 的工作原理,请阅读官方文档,其中写道:

Enumerates a sequence of key/value pairs and produces an immutable dictionary of its contents.

这是thread-safe吗? 是的,因为 ImmutableDictionary 是一个 thread-safe 并且从 ConcurrentDictionary 创建一个也应该是 thread-safe.

但是,值得问自己另一个问题:

  • 为什么我需要这个?

这个问题的原因是Immutable这个词,意思是每次发生修改时都会创建一个新的数据实例。

考虑到 multi-threading 意味着可能更改数据的多线程访问(除非您知道它不会被更改),它可能会成为一个非常大的性能损失。

您只需要将每个内部词典也转换为不可变词典,然后从中创建一个新的 ImmutableDictionary。

ImmutableDictionary<Type, ImmutableDictionary<Type, Action>> immutableDict = dict
    .ToImmutableDictionary(e => e.Key, e => e.Value.ToImmutableDictionary());