2011-05-03 66 views
1

我需要創建一個將在消費者和生產者之間共享的集合。 我無法使用BlockingCollection,因爲某些原因「BlockingCollection維護自己的計數,因此即使忽略重複項,計數也會增加,因此不會使用您的基本ConcurrentSet計數。」請參考我以前的問題Why my ConcurentSet doesn't work?在Consumer和Producer之間創建Set的最簡單方法是?

我真的很困惑爲什麼BlockingCollection寫了這麼奇怪的方式?這是否意味着C#庫類存在錯誤,因此我必須使用經典的「硬」方法http://msdn.microsoft.com/en-us/library/yy12yx1f(v=vs.80).aspx

只是想三重檢查我的錯誤,因爲在99%的情況下,寫的,但我只是如果這是有道理不懂的東西......

UPD - 我的設置可以包含1只整數100

回答

0

我看過你以前的問題「What type of IProducerConsumerCollection to use for my task?」。如果我理解正確,一方面你想按近似先進先出的順序處理來自傳感器的數據,另一方面,如果某個傳感器的數據在新數據準備好時尚未處理完畢,則需要更新它,丟棄較舊的數據。

我會向你推薦以下模式。
對於傳感器數據,只需使用一個數組;你表示這是足夠的:

我需要的是一個100個元素的數組。傳感器#33應該把它的值代入數組[33]消費者應該從數組[33]中取值,如果不是空值,則發送它並將數組[33]設置爲空。消費者應該對數組中的任何非空值做出反應。

訣竅是你如何更新數據。爲此,請使用Interlocked.Exchange而不是簡單的讀取/寫入。生產者使用它來編寫新值,然後檢查舊值(由Interlocked.Exchange返回)。如果不爲空,那麼舊值不會被消費者讀取,而您剛剛成功替換它。如果舊值爲空,則先前的數據已被消耗;在這種情況下,生產者會向消費者發送一條消息,提供新的數據。該消息可以由要讀取的數組單元的編號組成,並且可以通過ConcurrentQueue或其他合適的機制發送。
消費者等待通過該機制到達的消息,在消息中找到更新的數組單元格號,並且還使用Interlocked.Exchange將該單元格中的當前值替換爲null,並將該值作爲操作的結果返回。它將始終獲取寫入單元格的最新值,並且將按照獲取的消息順序處理值;與ConcurrentQueue,它應該是FIFO。

+0

非常感謝您的建議,我需要幾天的時間來嘗試它(現在休假),如果稍後對我有用,我會在這裏發佈 – javapowered 2011-05-08 11:30:19

相關問題