多线程批处理队列

Posted

技术标签:

【中文标题】多线程批处理队列【英文标题】:Multithread Batch Queue 【发布时间】:2012-11-12 23:18:24 【问题描述】:

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

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

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

【问题讨论】:

可以看看Queue.Synchronized 没有一些代码很难说问题出在哪里。 【参考方案1】:

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

【讨论】:

以上是关于多线程批处理队列的主要内容,如果未能解决你的问题,请参考以下文章

一个C# (队列多任务+多线程处理)对象的winform demo

Python 多线程同步队列模型

多线程批处理队列

队列与多线程间关系——个人理解

iOS 开发--多线程

python 多线程与队列