LINQ:目标数组不够长,无法复制集合中的所有项目。

时间:2012-01-23 20:41:02

标签: .net linq .net-4.0

我有一个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肯定不是空的。

3 个答案:

答案 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。