2014-03-12 59 views
0

幾天前,我遇到了一個問題,即我有一個具有歷史數據或非常大量對象的集合。這個集合暴露於如此多的線程或客戶端,因此,人們可能會迭代它,有些可能會添加到它,有些可能會在迭代時刪除此集合。所以,修改可能會在c#中引發「集合更改異常」。將對象添加到c中的大集合中併發症#

現在,我需要設計一個數據結構或C# 的集合,其滿足以下挑戰:

  1. 您可以收集無法複製到不同的對象作爲收藏是非常大的, 所以複製它會導致我們很多的內存浪費。

  2. 當任何用戶在迭代集合的同時添加到集合中時,應該將新對象添加到集合中,並且不應該拋出任何異常,並且還應該在迭代結束時讀取以及。

  3. 但萬一用戶從集合中刪除任何項目,它應該拋出異常。

  4. 添加,刪除和迭代應該是線程安全的。沒有競爭條件應該在那裏。

+3

考慮使用數據庫。 – SLaks

+0

數據庫是從磁盤讀取的,它不在內存中。它會減慢整個操作過程 –

+7

錯誤;數據庫引擎會將數據庫保存在內存中。 – SLaks

回答

0

如果你真的堅持使用集合而不是數據庫。沒有任何常規的.NET列表將是一個不錯的選擇。在這種情況下,您可以創建自己的針對您的情況進行了優化的列表類型。

它取決於其他細節(你可以使用分頁,你需要通過索引等訪問項目)你可以使用什麼技術。

一個想法可能是您創建一個可變列表,只有當它發生變化時,纔會創建一個不可變副本。所有的客戶端都使用最後一個不可變的副本。

相關問題