首先声明全局变量: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,也不会有问题才对。所以请各位朋友看看,如果没有办法,找其他替代的线程安全的也可以提供点意见。
然后是各个线程执行的代码:
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,也不会有问题才对。所以请各位朋友看看,如果没有办法,找其他替代的线程安全的也可以提供点意见。
Dictionary不是线程安全是这样的,多线程中它的操作都要加锁。
是这样,Monitor.Wait是在等待别的线程返回结果。别的线程会给这个key=guid的value一个值,但是这里仅是赋值,没有remove之类的,而且赋值的时候也是lock的,赋值后Push一下。就是这样的。