2

我在向通用字典 (WinRT C#) 添加值时遇到 IndexOutOfRange 异常。下面是我的代码和异常堆栈跟踪。

代码:

if (!data.TryGetValue(index, out cells))
{
   cells = new CellCollection();
   data.Add(index, cells);
}

堆栈跟踪:

在 System.Collections.Generic.Dictionary 2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary2.Add(TKey 键,TValue 值)

我不希望在添加时发生这种超出范围的异常。我的应用程序仅使用单线程。如果不需要,我已将值添加到字典并使用 GC.Collect() 从字典中删除它。然后根据需要添加值。

任何人都可以提出解决此异常的任何建议吗?

4

1 回答 1

4

在调用过程中Dictionary<,>.Add,有时需要分配一个新的后备数组,因为Count超过了Dictionary<,>. 当分配一个新的托管对象(新数组)时,垃圾收集器可能会设置。您的应用程序“暂停”并进行垃圾收集。然后在垃圾被收集后,控制从你在Add方法内部的位置恢复,新的支持数组被旧数组中的数据填充。

但是,根据您对上述问题的评论,您有finalizers。必须存在正在完成的不相关对象(可能是同一类的另一个实例)。似乎它包含对相同的引用Dictionary<,>。在完成过程中,您的析构函数代码会更改Dictionary<,>. 然后当主线程在垃圾回收后恢复控制时, 的状态Dictionary<,>已经改变,但我们正处于向该添加一个新元素的过程中Dictionary<,>

吸取的教训是:不要编写析构函数(终结器)。如果您仍然这样做,请不要更改(可以)从其他地方引用的托管对象的状态(即来自不会被收集的“活动”对象)。

Matthew Watson 在对您的问题的评论中说。

于 2014-11-05T09:47:12.853 回答