c# - 容量小于计数的 C# 异常
问题描述
当我在列表中添加一个项目时,我在 C# 中遇到了一个列表异常。我真的看不到那里有任何具体的东西。
tempList.ForEach(tempDis => alloc.ListDistribution.Add(tempDis));
当我悬停alloc.ListDistribution
时,调试器告诉我列表中有 6 个项目。如果我尝试扩展这些项目,我有一个例外情况:
源数组不够长。检查 srcIndex 和长度,以及数组的下限。在 System.Array.Copy(数组 sourceArray,Int32 sourceIndex,数组 destinationArray,Int32 destinationIndex,Int32 长度,布尔可靠)在 System.Collections.Generic.List
1.CopyTo(T[] array, Int32 arrayIndex) at System.Collections.Generic.Mscorlib_CollectionDebugView
1.get_Items()
我可以看到列表的容量是 4,而计数是 6。所以在系统增加容量时会触发异常。
虽然这对我来说毫无意义,但例外列表中提到的文档存在以下情况:
ArgumentOutOfRangeException 容量设置为小于 Count 的值。
但在备注中指定这不可能发生: Capacity 总是大于或等于 Count。如果在添加元素时 Count 超过了容量,则通过在复制旧元素和添加新元素之前自动重新分配内部数组来增加容量。
知道什么可能导致触发此异常吗?
解决方案
我确实有多个线程,他们不应该同时访问这些数据,但出于问题的目的,我们应该假设他们这样做
然后修复它,List<T>
不是线程安全的。如果两个线程同时添加或删除项目,它的内部计数器就会混乱。当您再次访问列表时,东西会中断,例如使用调试器检查其内容,但它可能会发生以及下一段代码访问它时。
同步您对该列表的访问。
此异常未记录在案,因为在多个线程中使用它不是其支持用法的一部分。
推荐阅读
- c++ - 从 Dll 调用具有偏移地址的成员函数
- oop - 我们可以在父类和子类中有相同的抽象方法吗
- c - 从 argv 文件创建结构,并将内容打印到一个带有单独标题的主文件中
- arrays - Month 数组覆盖而不是附加新值
- javascript - 将变量从 Javascript 传递到 Python 脚本
- python - 无法使用 vk_api 删除视频
- c++ - 仅在 2 的幂次上错过了 clang 中的优化
- nginx - nginx 位置指令附加到 url 路径
- c++ - c++ 11 原子变量上的哪些操作实际上是原子的?
- c# - 如果我在 asp.net 中为同步方法调用异步方法时不等待异步方法怎么办?