【发布时间】:2014-11-14 20:06:39
【问题描述】:
我有这样的班级构成。类声明了一个对象字典,这些对象本身具有一个内部字典对象。
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都是公开的,因此根据您尝试调用它们的顺序,锁定可能会以不同的顺序获取,并且您会遇到死锁。你想做什么?这似乎是一个相当复杂的设置。 -
我需要一种线程安全的方法来从内部字典中获取值的总和
-
在您需要总和时是否正在修改这些字典?如果是,您应该改用
ConcurrentDictionary。 -
我正在使用 .net 3.5 并且无法使用 .net 4 (
-
也许使用 ReaderWriterLockSlim ?
标签: c# multithreading dictionary collections thread-safety