代码之家  ›  专栏  ›  技术社区  ›  Mike_G

调用.ToArray()时发生ArgumentException

  •  3
  • Mike_G  · 技术社区  · 15 年前

    我有一张经常被清除的清单。代码是这样的:

    VisitorAgent[] toPersist;
    List<VisitorAgent> v = (List<VisitorAgent>)state;
    
    lock (v)
    {
       toPersist = v.ToArray();                       
    
       v.Clear();
    }
    
    //further processing of toPersist objects
    

    今天我刚收到一个例外的争论,这对我来说没有意义,除非有记忆问题。但如果是这样的话,为什么OOM不例外呢?调用toarray()时,什么会导致此异常?

    System.ArgumentException: Destination array was not long enough. Check destIndex and 
    length, and the array's lower bounds.
    

    我正在使用.NET 3.5&C。

    2 回复  |  直到 15 年前
        1
  •  7
  •   Ben M    15 年前

    这只是尖叫的比赛条件 lock 陈述是第一条线索)。

    我猜(在另一个线程中)有其他代码添加到 List<T> 在它分配目标数组之后,但在它开始复制之前。

    我要做的第一件事是仔细检查您的状态列表的所有可能的访问是否都被正确包装在 语句。

        2
  •  0
  •   Ben Hoffstein    15 年前

    有什么改变了 state 在分配数组的时间和复制列表内容的时间之间列出。锁定 v 除非填充状态的代码知道 V (本例中似乎没有)。

    推荐文章