0
我有这样的班级组成。类声明一个本身具有内部字典对象的对象的字典。如何使调用内部集合线程安全?
public class ValueObject
{
public float value = 0;
}
public class ValueDictionaryObject
{
private Dictionary<int, ValueObject> innerDict;
public float GetTotalValue()
{
lock (((ICollection)this.innerDict).SyncRoot)
{
float total = 0f;
foreach (var p in innerDict)
total += p.Value.value;
return total;
}
}
}
public class OuterDictionaryObject
{
private Dictionary<int, ValueDictionaryObject> outerDict;
public float GetTotalValueForSomeKey(int key)
{
lock (((ICollection)this.outerDict).SyncRoot)
{
return outerDict[key].GetTotalValue();
}
}
}
var outer = new OuterDictionaryObject();
我有问题,当调用多个线程,似乎发生死锁
float result = outer.GetTotalValueForSomeKey(key);
如何做这个调用线程安全吗?
您有时会锁定内部字典,有时锁定在外部字典上。 “GetTotalValue”和“GetTotalValueForSomeKey”都是公共的,这取决于你尝试调用它们的顺序,锁可能会以不同的顺序被采用,并且会导致死锁。 你想做什么?这似乎是一个非常复杂的设置。 – xxbbcc 2014-11-14 20:10:46
我需要一个线程安全的方式来从内部字典中获取值的总和 – 2014-11-14 20:17:12
这些字典是否在需要总和时被修改?如果是,则应该使用'ConcurrentDictionary'。 – xxbbcc 2014-11-14 20:19:01