首页 新闻 会员 周边 捐助

Dictionary 超出了数组界限

0
悬赏园豆:50 [已解决问题] 解决于 2014-04-27 22:46

异常内容:

索引超出了数组界限 

StackTrance

在System.collections.generic.dictionary.resize(int32 newsize,boolean forcenewhashcodes)

在system.collections.generic.dictionary.insert(tkey key,tvalue value,boolean add)

 

 

一般不会报这种错误 可以程序运行久了就会出错 ,我想知道报这种错误的具体引发原因是什么,然后解决办法是什么

念念啊的主页 念念啊 | 菜鸟二级 | 园豆:415
提问于:2014-04-26 10:04
< >
分享
最佳答案
0

比如数字有10个项,但你却要去取第11个项时就出这个错误

收获园豆:10
56180825 | 小虾三级 |园豆:1749 | 2014-04-26 12:05
其他回答(2)
0

直接原因同1楼,

但是你StackTrance列出来的表示你是在对集合做插入操作,可能原因:

插入位置为12,可集合长度小于12,

改情况要么是你传进来的集合就是小于12,要么是在获取完插入位置后,集合在其他线程被修改。

例如:

(1)

var dic=getdic();//只获取到11个元素
dic.insert(a,12);



(2)

public dic1;

Thread A

{

 index= GetIndexFromDicWhereMessIsTrue(dic1);

  sleep(10000);

dic1.insert(a,index);

}

thread B

{  dic1.clear();

}

main()

{

  dic1=getdic();
  threadA.strat();

  sleep(5000);

  threadB.start();

}
收获园豆:20
hailants | 园豆:750 (小虾三级) | 2014-04-26 15:12

你 谢谢 应该是这样的 后来加了lock

支持(0) 反对(0) 念念啊 | 园豆:415 (菜鸟二级) | 2014-04-27 22:45
0

这个需要注意线程安全和key值唯一。请参考以下简单的线程安全代码案例。

 

Dictionary d = new Dictionary();

Thread1Proc() 
    {    
         lock(d)     
        {         
            d.Add(a);     
        } 
    } 

Thread2Proc()
    {     
        lock(d)     
        {        
             d.Remove(a);    
         } 
    }
        
收获园豆:20
wongdavid | 园豆:394 (菜鸟二级) | 2014-04-26 22:04

谢谢

支持(0) 反对(0) 念念啊 | 园豆:415 (菜鸟二级) | 2014-04-27 22:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册