如何将工作编组到单个线程c#

时间:2012-05-16 08:53:29

标签: c# multithreading marshalling single-threaded

我有一个应用需要处理来自UDP广播的一些数据包,并将结果写入SQL数据库。 在间隔期间,传入数据包的速率变得非常高,我发现底层缓冲区溢出,即使是8MB,因为数据库写入速度很慢。

为了解决这个问题,我提出了两个选项,缓存一些DB写入, 和/或编组db写入另一个顺序操作的线程。 (必须保留db写入顺序)。

我的问题是如何使用c#的内置结构/功能最有效地编组工作?

我是否应该拥有一个同步队列,将委托工作项放在它上面,并在事件循环中让一个线程服务它?

2 个答案:

答案 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并使用该调度程序安排它。