调用.ToArray()时的ArgumentException
我有一个经常被清除的列表。 代码完全是这样的:
VisitorAgent[] toPersist; List v = (List)state; lock (v) { toPersist = v.ToArray(); v.Clear(); } //further processing of toPersist objects
今天我得到了一个Argumentexception,除非有内存问题,否则对我没有意义。 但如果是这样的话,为什么OOM不例外呢? 调用ToArray()时可能导致此exception的原因是什么?
System.ArgumentException: Destination array was not long enough. Check destIndex and length, and the array's lower bounds.
我使用的是.NET 3.5和C#。
这只是尖叫竞争条件( lock
声明是第一个线索)。
我猜其他一些代码(在另一个线程中)在分配目标数组之后但在它复制之前添加到List
。
我要做的第一件事是仔细检查每个可能的状态列表访问是否正确包装在一个lock
语句中。
在分配数组的时间和复制列表内容的时间之间,正在改变state
列表。 锁定v
对此没有影响,除非填充状态的代码知道v
(在这个例子中它似乎不是这样)。