2011-05-03 35 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

相关问题