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

Coo*_*ame 6 .net linq .net-4.0

我有一个Dictionary<string, mystruct>实例,我正在抓取所有值的列表:

var list = m_Records.Values.ToList();
Run Code Online (Sandbox Code Playgroud)

我偶尔会收到以下错误:

ArgumentException
Destination array is not long enough to copy all the items in the collection. Check array index and length.
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚从一条非常基本的路线到底是怎么回事.当VS2010中断该错误时,我可以检查m_Records并看到它有24个条目(稍有不同).但它确实有值,m_Records肯定不是null.

jas*_*son 14

您是否偶然在调用时修改另一个线程上的字典ToList?这将导致此错误,并且只是偶尔,正如您所说,因为此类问题取决于线程计时问题,这是众所周知的.我想不出有任何其他原因会发生这种情况.

相反,您应该使用ConcurrentDictionary(或停止多线程).(文件,它伤害了我做的时候这个.那就不要做那个.)


Jon*_*eet 6

如果这只是LINQ to Objects,我强烈怀疑你是在同一时间从另一个线程访问字典.看到它失败,我会感到非常惊讶.(ToList 实施起来并不是特别复杂 - 我怀疑BCL团队搞砸了这个.)

Dictionary<TKey, TValue>如果任何线程正在修改它,则不是线程安全的.如果你需要一个,你应该ConcurrentDictionary<TKey, TValue>在.NET 4中查看.

否则,只需确保您一次只能在一个线程中访问字典(用于读取写入).