Dictionary.Add方法上出现IndexOutOfRangeExpect
本文关键字:IndexOutOfRangeExpect Add 方法 Dictionary | 更新日期: 2023-09-27 18:29:15
在向泛型字典(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.Dictionary
2.添加(TKey键,TValue值)
我不希望在添加时出现这种超出范围的异常。我的应用程序仅使用单线程。如果不需要的话,我可以使用GC.Collect()将值添加到字典中,并将其从字典中删除。然后根据需要添加值。
有人能提出解决这一例外的建议吗?
在调用Dictionary<,>.Add
期间,有时需要分配一个新的后备阵列,因为Count
超过了Dictionary<,>
的当前容量。当分配一个新的托管对象(新数组)时,垃圾收集器可能会设置。您的应用程序将"暂停"并进行垃圾收集。然后,在收集垃圾之后,控制将从Add
方法内部的位置恢复,并且新的后台数组将填充旧数组中的数据。
但是,根据您对上述问题的评论,您有终结器。必须存在一个不相关的对象(可能是同一类的另一个实例),该对象正在被最终确定。它似乎引用了相同的Dictionary<,>
。在终结过程中,您的析构函数代码会更改Dictionary<,>
的状态。然后,当主线程在垃圾回收后恢复控制时,Dictionary<,>
的状态已经改变,但我们正处于向Dictionary<,>
添加一个新元素的过程中。
吸取的教训是:不要编写析构函数(终结器)。如果您仍然这样做,请不要更改从其他地方(即不会收集的"活动"对象)引用的托管对象的状态。
Matthew Watson在回答你的问题时说了这句话。