Dictionary Error

在使用Dictionary<T,T1>的Add方法,内部竟然抛出"未将对象引用设置到对象的实例。",这个错误只有在并发的时候出现。

代码如下:

 


        internal static string GetParamName()
        {
            
                
int id = System.Threading.Thread.CurrentThread.ManagedThreadId;
                
if (!mSeed.ContainsKey(id))
                    mSeed.Add(id, 
new ParamNameSeed());
                ParamNameSeed pns 
= mSeed[id];
                
if (pns.Value > 100)
                    pns.Value 
= 0;
                
else
                    pns.Value
++;
                
return "p" + pns.Value;
          
        }
        
static Dictionary<int, ParamNameSeed> mSeed = new Dictionary<int, ParamNameSeed>();

 

抛出错误的是:

mSeed.Add(id, new ParamNameSeed());

错误情况:

未将对象引用设置到对象的实例。
在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
在 System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
在 Smark.Data.Expression.GetParamName() 位置 F:\Projects\SmarkProject\Smark.Data\Expression.cs:行号 84
在 Smark.Data.FieldInfo.Eq(Object value) 位置 F:\Projects\SmarkProject\Smark.Data\Expression.cs:行号 133
在 Smark.Data.FieldInfo.op_Equality(FieldInfo field, Object value) 位置 F:\Projects\SmarkProject\Smark.Data\Expression.cs:行号 343

修改代码如下该错误暂时没有出现:

 


        internal static string GetParamName()
        {

            Dictionary
<int, ParamNameSeed> seedTable = GetSeedTable();    
            
int id = System.Threading.Thread.CurrentThread.ManagedThreadId;
            
if (!seedTable.ContainsKey(id))
                seedTable.Add(id, 
new ParamNameSeed());
                ParamNameSeed pns 
= mSeed[id];
                
if (pns.Value > 100)
                    pns.Value 
= 0;
                
else
                    pns.Value
++;
                
return "p" + pns.Value;
          
        }
        
static Dictionary<int, ParamNameSeed> mSeed =null//new Dictionary<int, ParamNameSeed>();
        static object mLockSeed = new object();
        
static Dictionary<int, ParamNameSeed> GetSeedTable()
        {
            
if(mSeed==null)
            {
                
lock (mLockSeed)
                {
                    
if (mSeed == null)
                        mSeed 
= new Dictionary<int, ParamNameSeed>();
                }
            }
            
return mSeed;
        }
posted on 2009-04-29 14:16  西湖浪子  阅读(339)  评论(0)    收藏  举报