我有以下情況:我有一個C#字典,它有一個int作爲鍵(唯一ID)和一個自定義類作爲值,例如, Dictionary<int, CustomClass>
(這不是ConcurrentDictionary
)。它是否線程安全/是否有任何競爭條件,如果我產生多個線程,這些線程在整個字典上設置不同類屬性的數據?全部加上在字典上的操作已經在線程設置數據之前完成了。C#併發性:寫在不同的對象屬性
更新的代碼(以明確的事情一點點):
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'語句使您的操作線程安全。 – Piou
任何線程是否會訪問該對象的相同對象/值或屬性?這些操作中的任何一個都依賴於讀取屬性值,還是隻設置它們? –
提供有關您計劃如何處理對象的更多細節將會很有幫助。如果您從不同的線程讀取和寫入屬性,可能會出現影響屬性值的競爭條件。最簡單的解決方案是爲每個值設置一個「對象」,在與對象交互時「鎖定」,但這可能是過度殺傷。 –