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
(或停止多线程).(文件,它伤害了我做的时候这个.那就不要做那个.)
如果这只是LINQ to Objects,我强烈怀疑你是在同一时间从另一个线程访问字典.看到它失败,我会感到非常惊讶.(ToList
实施起来并不是特别复杂 - 我怀疑BCL团队搞砸了这个.)
Dictionary<TKey, TValue>
如果任何线程正在修改它,则不是线程安全的.如果你需要一个,你应该ConcurrentDictionary<TKey, TValue>
在.NET 4中查看.
否则,只需确保您一次只能在一个线程中访问字典(用于读取或写入).
归档时间: |
|
查看次数: |
8384 次 |
最近记录: |