我有一個文件列表,其中每個文件包含一個Foo
數據列表。現在,同一段Foo數據(例如Id = 1
)可能存在於多個文件中,但最近的一段數據會覆蓋現有數據。如何在Parallel.ForEach期間添加或更新此.NET集合?
我只是將每段數據讀入內存集合中。
if !cache.HasKey(foo.Id) then Add
else cache[foo.Id].UpdatedOn < foo.UpdatedOn then Update
else do nothing
當我在文件正在讀(原因有幾個EM的),我還使用Parallel.ForEach(files, file => { .. });
我不知道我是如何做到這一點。
我正在考慮使用ConcurrentDictionary
但我不確定如何做AddOrUpdate
與其中條款thingy。
有什麼建議嗎?
存在爭用條件 - 以預防,與'鎖(foo.Id)包住上述代碼' block:「ConcurrentDictionary是爲多線程場景設計的,你不必在你的代碼中使用鎖來添加或刪除集合中的項目,但是,一個線程總是可以檢索一個值,而另一個線程線程來立即通過賦予相同的關鍵值一個新的值來更新集合。「從MSDN「如何:從ConcurrentDictionary添加和刪除項目」 –
Moho
@Moho,什麼競爭條件? – Grzenio
有可能兩個線程具有相同的'foo。Id'鍵值同時執行'AddOrUpdate'方法。 – Moho