2012-11-25 116 views
3

我目前正在写一个TCP监听器,它有许多客户端应用程序发送短消息给。我所拥有的TCP监听器是一个C#winform,我需要做的是批量处理这些日志,以避免在队列中收到的每条消息都触及数据库。目前,在侦听器收到的每条消息中,我使用C#队列类进行Enqueue。多线程批处理队列

每5分钟执行一个单独的线程来检查此队列,并在有任何排队的项目时开始处理队列。看起来这个设计有一个并发/竞争条件问题,因为当5分钟线程启动时,接收到的新消息不能再访问队列,因为我在DeQueue期间锁定了它。因此,这些新消息会丢失。它似乎只在有大量消息发送给TCP侦听器时发生。

有没有人认为这是我的一个有缺陷的设计,或者会有更好的解决方案吗?我不允许基于发送消息的客户端应用程序的限制使用MSMQ或WCF。

+0

可能看[Queue.Synchronized](http://msdn.microsoft.com/en-us/library/system.collections.queue.synchronized(v = vs.90).aspx) – Prescott

+0

很难说什么问题是没有一些代码。 – Tudor

回答

0

因此,您有一个生产者 - 消费者场景,有多个生产者和一个(缓冲)消费者。你可能想看看Reactive Extensions(他们有一个适用于.NET 3.5的版本)。至少,你可以利用他们的backport BlockingCollection<T>