关于使用RFID进行C#线程的问题

我的问题是关于确保我采取正确方法并正确处理线程的反馈。 我有一种感觉,我可能需要设置一些自己的线程,所以欢迎所有反馈。

我遇到的问题是从零个或多个RFID阅读器读取RFID标签。 我可以在没有问题的情况下阅读单个读者,因此从几个读取不会是一个问题。 读者阅读的每个标签或批次标签都由.Net事件提供。

我的计划是设置一个ReaderControl类,它维护读者,连接,启动,停止等。这个类将听取读者的TagRead事件。 它处理的每个事件(大约每250毫秒)它将读取标记ID(一个字符串)放入一个HashSet以保持它们的唯一性,HashSet位于ReaderControl中。 ReaderControl将包含一个计时器,每500ms触发一次,这个TimerElapsed事件由ReaderControl处理,它将打包从目前为止从所有读取器读取的标签并引发TagsRead事件。 这样做的目的是将事件触发保持在最低限度并减少重复标记。

TagsReads事件由另一个名为TagTranslator的类处理。 这个类将遍历标记ids(字符串)并计算出标记引用的内容,即IPerson对象。 此课程将在完成翻译时使用PeopleSeen事件触发事件。

PeopleSeen事件由GUI中的模型(MVP模式)处理。 总体思路是GUI显示屏显示通过RFID阅读器的人的名字。 显示器很简单,但显然在引擎盖标签正在asych中读取并被转换为“真实”对象以进行显示。

你认为ReaderControl应该在自己的线程上运行,我认为它应该。 我如何在自己的线程中打包这个类,无论GUI在做什么,都只是继续阅读标签。 另外,您认为TagTranslator在处理事件时应该创建线程来处理翻译。

我建议,使用并发队列数据结构和多生产者,单个消费者模型,而不是使用事件。 将标签阅读器线程视为生产者,将处理线程视为消费者。

当线程从阅读器接收标签时,它会将该标签添加到队列中,而不必担心重复或任何事情。 哎呀,你可能在某些时候想要那些重复的信息。 没理由在这里扔掉它。

消费者等待队列,关闭物品并一次处理一件物品。

BlockingCollection类非常适合这种情况。

 // Shared queue. Assuming that a tag is simply a string. BlockingCollection TagQueue = new BlockingCollection(); // Tag reader threads (producers) while (!ShutdownMessageReceived) { string tag = GetTagFromReader(); // however that's done TagQueue.Add(tag); } // Processing thread (consumer) while (!ShutdownMessageReceived) { string tag = TagQueue.Take(); // process the tag } 

BlockingCollection支持多个生产者和消费者,因此您可以根据需要拥有多个生产者和消费者。 Take方法将阻止,直到某个项目可用。 这是一个非忙碌的等待,所以没有轮询开销。

使用BlockingCollection可以很容易地实现这种function,并且可以实现干净简单的代码。