我知道在迭代它时我无法修改它。
通常我会复制我想要迭代的集合,然后遍历副本以避免错误。
我的节目;但是,对我正在试图复制的集合进行了大量快速修改。
错误是否正在发生,因为我在修改父集合时正在制作副本?
我知道ConcurrentDictionary为交叉线程提供了某种锁定机制。我可以使用类似的东西来防止这个错误吗?
// Original collection:
Dictionary<string, Enemy> Dict_Enemies = new Dictionary<string, Enemy>();
// Copy of original collection: (this line throws the exception)
Dictionary<string, Enemy> Dict_Enemies_Copy = new Dictionary<string, Enemy>(Dict_Enemies);
答案 0 :(得分:2)
尝试使用Dict_Enemies
// Original collection:
var Dict_Enemies = new ConcurrentDictionary<string, Enemy>();
// Thread-safe copy:
ICollection<KeyValuePair<string, Enemy>> Dict_Enemies_Copy = Dict_Enemies.ToArray();
来允许从多个线程修改它。然后使用ConcurrentDictionary方法在线程安全操作中复制它:
{{1}}
答案 1 :(得分:1)
Dictionary<K,V>
不支持多个并发编写器,这意味着您必须已有锁。只需确保在持有锁定的同时创建副本。
答案 2 :(得分:0)
将此字典封装为类的私有成员,并使用锁(在两个位置使用相同的锁对象,可能是字典本身)以确保写入和副本不会同时发生。不允许在其他任何地方直接访问字典。
答案 3 :(得分:0)
但类似的代码对我来说非常有用.....你能不能对你的代码作出更多解释?
Dictionary<int, Test> dicOrg = new Dictionary<int, Test>();//Original
dicOrg.Add(1, new Test() {id= 1,name="name",add="add"});
Dictionary<int, Test> dicCopy = new Dictionary<int,Test>(dicOrg);//Copy of dicOrg