写C#代码时,遇到有过程需要排队执行,就使用了lock方法进行锁定,锁定对象为一List<T>数组,在临界区代码段中对该数据进行读取操作。在某些偶然情况下,会发现该数据在锁定代码段以外进行访问时,会抛出一个异常:“源数组长度不足。请检查 srcIndex 和长度以及数组的下限”,此时再执行其他操作就无效了。后查阅资料发现,lock锁定代码中对该数据的操作尚未执行完毕,别处就已在使用该数组,可能是导致异常的一个原因,遂将原来的锁定代码:
lock (lsFieldInfo)
{
///......
lsFieldInfo.ToList().ForEach(e => e.ToBuffer(aObject, pFeatureBuffer));
///......
}
修改为:
object synObj = new object();
lock (synObj)
{
///......
lsFieldInfo.ToList().ForEach(e => e.ToBuffer(aObject, pFeatureBuffer));
///......
}
尝试发现,能解决问题。