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