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