我有一个Dictionary<string, mystruct>
实例,我正在抓取所有值的列表:
var list = m_Records.Values.ToList();
我偶尔会收到以下错误:
ArgumentException
Destination array is not long enough to copy all the items in the collection. Check array index and length.
我正在试图弄清楚从一条非常基本的线路到底是怎么回事。当VS2010中断该错误时,我可以检查m_Records
并查看它有24个条目(稍有不同)。但它确实有值,而m_Records肯定不是空的。
答案 0 :(得分:14)
您是否偶然在调用ToList
时修改另一个帖子上的字典?这将导致此错误,并且只是偶尔,正如您所说,因为此类问题取决于线程计时问题,这是众所周知的。我想不出有任何其他原因会发生这种情况。
相反,您应该使用ConcurrentDictionary
(或停止多线程)。 (Doc,当我这个时会很痛。然后不要那个。)
答案 1 :(得分:6)
如果这只是LINQ to Objects,我强烈怀疑你是在同一时间从另一个线程访问字典。看到它失败,我会感到非常惊讶。 (ToList
isn't particularly complicated to implement - 我怀疑BCL团队搞砸了这个。)
Dictionary<TKey, TValue>
不线程安全。如果您需要的是,那么您应该在.NET 4中查看ConcurrentDictionary<TKey, TValue>
。
否则,只需确保您一次只能在一个线程中访问字典(用于读取或写入)。
答案 2 :(得分:1)
如果您在阅读字典时正在修改字典,则会显示此错误。字典对于写入来说不是线程安全的,如果你需要它们,你应该使用ConcurrentDictionary。