用内部不可变字典构造不可变字典
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());
我有以下字典并希望使其不可变;
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());