Dictionary.Add方法中发生IndexOutOfRangeException

时间:2014-11-05 08:26:28

标签: c# generics dictionary windows-runtime indexoutofrangeexception

我在向通用字典(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()从字典中删除它。然后根据需要添加值。

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

1 个答案:

答案 0 :(得分:4)

在致电Dictionary<,>.Add期间,有时需要分配新的支持阵列,因为Count超出了Dictionary<,>的当前容量。在分配新的托管对象(新阵列)时,垃圾收集器可能会设置。您的应用程序被“暂停”并进行垃圾回收。然后,在收集垃圾后,控制将从Add方法中的位置恢复,新的后备阵列将填充旧数据中的数据。

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

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

Matthew Watson在评论你的问题时说。