【问题标题】:List<T>: Clear; AddRange; Add; Delete; ect.. causes System.IndexOutOfRangeException列表<T>:清除;添加范围;添加;删除;等..导致 System.IndexOutOfRangeException
【发布时间】:2014-01-26 05:16:43
【问题描述】:

我在尝试清除列表时遇到以下异常。

System.IndexOutOfRangeException occurred
  HResult=-2146233080
  Message=Index was outside the bounds of the array.
  Source=mscorlib
  StackTrace:
       at System.Array.Clear(Array array, Int32 index, Int32 length)
       at System.Collections.Generic.List`1.Clear()
       at SystemFilterFactory.ResetSystemFilters() in d:\Source\SystemFilterFactory.cs:line 57
  InnerException: 

没有显示真正的异常,该列表的基础是给出以下异常

目标数组不够长。检查 destIndex 和长度,以及数组的下限。

【问题讨论】:

    标签: c# multithreading list exception


    【解决方案1】:

    实际上,在发布我的问题之前,我最终从这篇文章中找到了原因 LIST<> AddRange throwing ArgumentException

    但是,由于我没想到真正的问题出在列表上,因此需要进行更多搜索。

    事实证明,由于 List 不是线程安全的,因此在多个线程上同时更改大小的列表上执行操作可以使该列表上的任何内容都无法正常工作。

    因此,要对列表进行操作,请确保以线程安全的方式进行操作。

    【讨论】:

    • 应该是常识。当 .net 4 推出 System.Collections.Concurrent 命名空间时引起了极大的轰动
    • 不只是“将在哪里改变大小”。当其他人可以修改列表时,所有操作都是不安全的。
    • @Henk Holterman 确实,它们都不安全,但是改变列表大小的那些可能会填满底层数组(我假设在某些情况下大小变得太小)这样就不会对数组进行任何操作。
    • This is a great article 非常简洁地演示了并发访问线程不安全数据结构的副作用可能是多么奇怪
    猜你喜欢
    • 2023-01-20
    • 2013-09-05
    • 1970-01-01
    • 2010-12-21
    • 2011-08-12
    • 1970-01-01
    • 2022-06-11
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多