发现锁定Dictionary的时候,它的属性Keys并没有被锁定
原创文章,未经允许,请勿转载
前几天在压力测试的时候发现的并发问题,记录一下 发现锁定Dictionary的时候,它的属性Keys并没有被锁定(不知道Values是不是也一样?),在遍历Keys的时候还是会报值已修改,无法遍历的错误。 如下代码,横线处会引发错误:
public static void CloneKeyTo(Dictionary<string, object> sourceASO, out Dictionary<string, object> desASO)
{
desASO = new Dictionary<string, object>();
lock (sourceASO)
{
foreach (string key in sourceASO.Keys)
{
desASO[key] = sourceASO[key];
}
}
}
解决方案如下:
public static void CloneKeyTo(Dictionary<string, object> sourceASO, out Dictionary<string, object> desASO)
{
desASO = new Dictionary<string, object>();
string[] keys;
lock (sourceASO.Keys)
{
keys = new string[sourceASO.Keys.Count];
sourceASO.Keys.CopyTo(keys, 0);
}
foreach (string key in keys)
{
lock (sourceASO)
{
if (sourceASO.ContainsKey(key))
{
desASO[key] = sourceASO[key];
}
}
}
}
来源:悠游悠游,原文地址:https://yymmss.com/p/77.html