首页 新闻 会员 周边

System.ArgumentException: 源数组长度不足

0
悬赏园豆:20 [已解决问题] 解决于 2017-04-18 14:13

VS2015,C#

全局定义
private List<StatFreqDomCenter> GLstFFreqCenter = null;
线程1:
private void CashNewDatas(List<StatFreqDomCenter> lstTmp)
{
if (null == lstTmp || lstTmp.Count < 1) return;
lstTmp.RemoveAll(o => o == null);
if (null == GLstFFreqCenter) GLstFFreqCenter = new List<StatFreqDomCenter>();
while (GLstFFreqCenter.Count > FLAGCOUNT) Thread.Sleep(1000);
GLstFFreqCenter.AddRange(lstTmp);
}
线程2:
lock (GLstFFreqCenter)
{
len = (GLstFFreqCenter.Count > BATCNT) ? BATCNT : GLstFFreqCenter.Count;
lstTmp = GLstFFreqCenter.GetRange(0, len);
GLstFFreqCenter.RemoveRange(0, len); // 错误行
}

错误提示信息:

System.ArgumentException: 源数组长度不足。请检查 srcIndex 和长度以及数组的下限。
在 System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable)
在 System.Collections.Generic.List`1.RemoveRange(Int32 index, Int32 count)

cyclone119的主页 cyclone119 | 初学一级 | 园豆:90
提问于:2017-03-27 13:36
< >
分享
最佳答案
1

虽然不知道你线程1和线程2的关系,但在最差情况下这个List<StatFreqDomCenter>会被同时看到(操作),List的任何实例方法都不保证线程安全性,因此这里会出现一些稀奇古怪的错,如果不考虑太多性能问题的话建议这两个线程的委托方法做强同步或者将这个list改成ConcurrentQueue。

收获园豆:20
Daniel Cai | 专家六级 |园豆:10424 | 2017-03-27 15:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册