首先声明全局变量:private volatile static Dictionary<string, value> ClaimValueToGuid = new Dictionary<string, value>();
然后是各个线程执行的代码:
DateTime lockerTime = DateTime.Now;
                string guid=Guid.NewGuid().ToString("N");
lock(locker){
                ClaimValueToGuid.Add(guid, null);
                //执行其他事情。
            if(ClaimValueToGuid[guid]==null){                 Monitor.Wait(locker,9000);
              }
}
 while ((DateTime.Now - lockerTime).TotalMilliseconds < 9000&& ClaimValueToGuid[guid] == null)
                {
                    if (ClaimValueToGuid[guid]==null)
                    {
                        Thread.Sleep(500);
                    }
                } 
 AddReceiveInfo e = ClaimValueToGuid[guid];
                ClaimValueToGuid.Remove(guid);
在运行的时候,经常出现报错,其中看到一个这样的,出现错误的时候,我看到ClaimValueToGuid竟然有这样的值。那么我判断 if (ClaimValueToGuid[guid]==null)就报错了。报错时即使窗口看到的变量是:
ClaimValueToGuid
Count = 2
    [0]: {[11b493f885c2460b934ac13e056f9c3b, ]}
    [1]: {[, ]}
请问下这应该怎么解决。记得这是多线程下,几乎可能同时执行的。朋友说Dictionary不是线程安全,如果需要安全处理,那么就需要加锁,然而,我这里Add是有加锁。但是remove没有,因为我认为,remove只有在示例代码段中存在,其他线程不会remove掉他的。哪怕remove,也是remove掉当前作用域中的guid,也不会有问题才对。所以请各位朋友看看,如果没有办法,找其他替代的线程安全的也可以提供点意见。

解决方案 »

  1.   

    为啥在lock块中还要使用 Monitor.Wait(locker,9000); ?
    Dictionary不是线程安全是这样的,多线程中它的操作都要加锁。
      

  2.   


    是这样,Monitor.Wait是在等待别的线程返回结果。别的线程会给这个key=guid的value一个值,但是这里仅是赋值,没有remove之类的,而且赋值的时候也是lock的,赋值后Push一下。就是这样的。