我在向通用字典(WinRT C#)添加值时收到IndexOutOfRange异常。下面是我的代码和异常堆栈跟踪。
代码:
if (!data.TryGetValue(index, out cells))
{
cells = new CellCollection();
data.Add(index, cells);
}
堆栈追踪:
at System.Collections.Generic.Dictionary
2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary
2.Add(TKey key,TValue value)
我不希望在添加时发生超出范围的异常。我的应用程序仅使用单线程。 我已经为字典添加了值,如果不需要,可以使用GC.Collect()从字典中删除它。然后根据需要添加值。
任何人都可以提出任何解决此异常的建议吗?
答案 0 :(得分:4)
在致电Dictionary<,>.Add
期间,有时需要分配新的支持阵列,因为Count
超出了Dictionary<,>
的当前容量。在分配新的托管对象(新阵列)时,垃圾收集器可能会设置。您的应用程序被“暂停”并进行垃圾回收。然后,在收集垃圾后,控制将从Add
方法中的位置恢复,新的后备阵列将填充旧数据中的数据。
但是,根据您对上述问题的评论,您有终结者。必须存在一个无关的对象(可能是同一个类的另一个实例)正在最终确定。它似乎引用了相同的Dictionary<,>
。在最终确定期间,您的析构函数代码会更改Dictionary<,>
的状态。然后当主线程在垃圾收集后恢复控制时,Dictionary<,>
的状态已经改变,但是我们正处于向Dictionary<,>
添加一个新元素的过程中。
吸取的教训是:不要编写析构函数(终结函数)。如果您仍然这样做,请不要更改(可以)从其他地方引用的托管对象的状态(即来自不会收集的“活动”对象)。
Matthew Watson在评论你的问题时说。