gpt4 book ai didi

c# - IndexOutOfRangeExpection 发生在 Dictionary.Add 方法上

转载 作者:行者123 更新时间:2023-11-30 20:46:33 24 4
gpt4 key购买 nike

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

代码:

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

堆栈跟踪:

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

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

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

最佳答案

在调用 Dictionary<,>.Add 期间有时需要分配一个新的支持数组,因为 Count超过了 Dictionary<,> 的当前容量.当分配一个新的托管对象(新数组)时,垃圾收集器可能会启动。您的应用程序“暂停”并且发生垃圾收集。然后在收集垃圾之后,控制从您在 Add 中的位置恢复。方法,新的后备数组填充了旧的数据。

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

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

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

关于c# - IndexOutOfRangeExpection 发生在 Dictionary.Add 方法上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26752572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com