2010-07-06 59 views
2

我有一个列表,每隔一段时间清除一次。该代码是完全一样:ArgumentException当调用.ToArray()

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#。

回答

6

这只是尖叫的竞争条件(lock声明是第一个线索)。

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

我要做的第一件事是仔细检查对状态列表的每个可能的访问是否被正确包装在lock声明中。

+0

我几乎肯定你说得对,在你说完之后,我经历了所有对状态对象的回应,而且看起来我错过了一个。 – 2010-07-06 17:52:33

0

有些东西正在改变state列表之间的阵列分配的时间和列表的内容被复制的时间。锁定v将不会对此产生任何影响,除非填充状态的代码知道v(在此示例中它似乎不是)。