悬赏园豆:20
[已关闭问题]
<P>程序代码如下:</P>
<P>private IDictionary<string, BtsClass> btsClassList = new Dictionary<string, BtsClass>();</P>
<P> BtsClass tempClass = null;<BR> if (!btsClassList.Keys.Contains(btsName))<BR> {<BR> tempClass = new BtsClass(btsName, 15);<BR> tempClass.MaginDelegate += new MaginDelegate(BtsClass_MaginDelegate);<BR> btsClassList[btsName] = tempClass;//这个地方,出现错误。。。<BR> }<BR> else<BR> {<BR> tempClass = btsClassList[btsName];<BR> }<BR></P>
<P>如上的代码,在标著的地方,出现了这样的错误:</P>
<P>System.IndexOutOfRangeException: 索引超出了数组界限。<BR> 在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)<BR> 在 System.Collections.Generic.Dictionary`2.set_Item(TKey key, TValue value)</P>
<P> </P>
<P>实在是搞不明白,怎么会出现如上的错误....</P>
<P>请各位老大帮忙看看.</P>
<P> </P>
问题补充:
反编译查看了下Directory的代码:
btsClassList.Add(btsName,tempClass);
与
btsClassList[btsName] = tempClass;
最终的不同在于调用 Insert(TKey key, TValue value, Boolean add)
这个方法传递的参数不同.
前一种方法的Boolean add 为true;
后一种方法的Boolean add 为false;
而唯一用到这个 参数的地方 只有一处:
for (int i = this.buckets[index]; i >= 0; i = this.entries[i].next)
{
if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
{
if (add)
{
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}
this.entries[i].value = value;
this.version++;
return;
}
}
看了下,不管用哪种方法,似乎还是会存在 错误的可能....
索引超出数组界限....看见这个问题的时候,最开始以为btsClassList[btsName] = tempClass; 这样使用,当空间不够的时候,没有重新申请空间 才会导致 有这样的错误.
看了下源代码,实际上当 栈间不够的时候,有重新在分配的过程........
//2008-07-04 18:49:00
呵呵,产生这样的错误,最终可能在于:
1:程序 多线程
2:Directory 不是线程安全的......
参考:
1:http://forums.msdn.microsoft.com/zh-CN/netfxbcl/thread/c8a83d23-a62e-4e37-a902-8e229bf3c31f/
2:http://forums.msdn.microsoft.com/zh-CN/csharpgeneral/thread/283a0e50-749e-43de-9f3c-6af314ff31be/
颜昌钢
|
初学一级
|
园豆:
150
提问于:2008-07-04 15:05