2016-02-05 57 views
0

我正在研究一個多線程應用程序,其中我從外部源加載數據並將它們存儲在內部集合中。 這些集合每X分鐘更新一次,方法是再次加載外部提要中的所有數據。 這些集合中沒有其他添加/刪除,只是閱讀。更新併發集合

通常我會在更新過程中使用鎖定,與我在訪問集合時無處不在。

問:

千萬的併發集合使我的生活更容易在這種情況下? 基本上我看到兩種方法

  1. 負載從外部引入的數據,然後除去不存在的項目了,添加缺少的,並更新了改變 - 我想這是與同時幫助一個很好的解決方案收集(不需要鎖定,對嗎?),但它需要我的代碼太多。我只能用舊的集合對象覆蓋舊的集合對象(例如_data = new ConcurentBag(newData)。在這裏我確信使用併發集合根本沒有優勢,我是對的嗎?鎖定機制是必需的。

是否有現成的解決方案,我可以使用,使用併發收集的?我不希望再推倒重來。

+0

這是不是很清楚你的問題是什麼。你有一個對象的集合,你正在尋找一個基本上'合併' - '主'集合與'下載'集合的解決方案。所以這些問題基本上是 - 我如何將c#中的2個集合與1行代碼合併?是對的嗎 ? – Marty

回答

1

是的,對於併發集合鎖定機構存儲在收藏中,所以如果你new取代舊的一個集合,那剛剛擊敗t他的目的。它們主要用於生產者 - 消費者的情況,通常與BlockingCollection<T>結合使用。如果你的製作者不僅僅是添加數據,它會讓事情變得更加複雜。

的好處是用併發集合是你的鎖定機制不再依賴於集合 - 你可以有一個單獨的同步objectlock,並在關鍵節內您可以自由分配另一個實例像你想的那樣。

要回答你的問題 - 我不知道任何開箱即用的機制來做你想做的事,但我不會使用簡單的lock聲明「重新發明輪子」。這有點像說使用for循環正在重新發明輪子。只需在非併發集合旁邊有一個單獨的同步對象。