我有一个应用需要处理来自UDP广播的一些数据包,并将结果写入SQL数据库。 在间隔期间,传入数据包的速率变得非常高,我发现底层缓冲区溢出,即使是8MB,因为数据库写入速度很慢。
为了解决这个问题,我提出了两个选项,缓存一些DB写入, 和/或编组db写入另一个顺序操作的线程。 (必须保留db写入顺序)。
我的问题是如何使用c#的内置结构/功能最有效地编组工作?
我是否应该拥有一个同步队列,将委托工作项放在它上面,并在事件循环中让一个线程服务它?
答案 0 :(得分:2)
最简单的方法是为UDP读取创建一个单独的线程。
线程只接收包并将它们放入BlockingCollection中。 (不知道你怎么做数据包读取所以这将是伪代码)
BlockingCollection<Packet> _packets = new BlockingCollection<Packet>();
...
while (true) {
var packet = udp.GetNextPacket();
_packets.Add(packet);
}
这将确保您不会错过任何包,因为阅读线程正忙。
然后,您创建一个与当前代码完成相同操作的工作线程,但它会从blockingcollection中读取。
while (true) {
var nextPacket = _packets.Take();
...
}
如果您的软件包是独立的(因为您使用UDP,它们应该是它们),您可以启动多个工作线程。
答案 1 :(得分:1)
如果您使用的是.Net 4,Tasks and TaskSchedulers可以帮助您。在MSDN上,您将找到LimitedConcurrencyLevelTaskScheduler。创建一个单独的实例,并发级别为1,每次有工作要做,创建一个Task并使用该调度程序安排它。