【发布时间】:2016-12-28 15:05:46
【问题描述】:
我有以下情况:我有一个 C# 字典,它有一个 int 作为键(唯一 ID)和一个自定义类作为值,例如Dictionary<int, CustomClass>(不是ConcurrentDictionary)。如果我生成多个线程,这些线程都在整个字典的不同类属性上设置数据,它是线程安全的吗?对字典的所有add操作都在线程设置数据之前完成。
用代码更新(稍微清楚一点):
class Foo {
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public string Prop3 { get; set; }
}
// Initialized with 100 entries - Keys: 0 to 99
Dictionary<int, Foo> dict = new Dictionary<int, Foo>();
List<Task> tasks = new List<Task>();
tasks.Add(Task.Factory.StartNew(() => {
for(int i = 0; i < dict.Count; i++) {
dict[i].Prop1 = "whatever";
}
}));
tasks.Add(Task.Factory.StartNew(() => {
for(int i = 0; i < dict.Count; i++) {
dict[i].Prop2 = "whatever";
}
}));
tasks.Add(Task.Factory.StartNew(() => {
for(int i = 0; i < dict.Count; i++) {
dict[i].Prop3 = "whatever";
}
}));
Task.WaitAll(tasks.ToArray());
【问题讨论】:
-
考虑使用
lock语句使您的操作线程安全。 -
是否有任何线程正在访问该对象的相同对象/值或属性?这些操作中的任何一个都依赖于读取属性值,还是仅仅设置它们?
-
提供有关您计划如何处理这些对象的更多详细信息将很有帮助。如果您从不同的线程读取和写入属性值,则可能存在影响属性值的竞争条件。最简单的解决方案是为每个值设置一个
object,在与对象交互时设置为lock,但这可能有点矫枉过正。 -
每个线程将数据写入自定义类的不同属性,但写入字典的所有项目。所以没有两个线程将数据写入同一个属性,但至少有两个线程将数据写入同一个对象的不同属性。
-
我不会指望将来没有代码更改会搞砸事情,所以我会使用
ConcurrentDictionary并使整个读/写线程安全。我的意思是,为什么不以好的方式去做呢?现在节省时间与未来不可预测的行为?
标签: c# multithreading dictionary