gpt4 book ai didi

c# - 如何将工作编码到单线程 C#

转载 作者:行者123 更新时间:2023-11-30 22:28:46 28 4
gpt4 key购买 nike

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

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

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

我是否应该只拥有一个同步队列,将委托(delegate)工作项放入其中,并让一个线程在事件循环中为它提供服务?

最佳答案

最简单的方法是为 UDP 读取创建一个单独的线程。

线程只是接收包并将它们放入 BlockingCollection 中。(不知道你是如何读取数据包的,所以这将是伪代码)

BlockingCollection<Packet> _packets = new BlockingCollection<Packet>();
...

while (true) {
var packet = udp.GetNextPacket();
_packets.Add(packet);
}

这将确保您不会因为阅读线程繁忙而错过任何包裹。

然后您创建一个工作线程,它执行与您当前代码相同的事情,但它改为从阻塞集合中读取。

while (true) {
var nextPacket = _packets.Take();
...
}

如果您的包是独立的(它们应该是独立的,因为您使用 UDP),您可以启动多个工作线程。

关于c# - 如何将工作编码到单线程 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10615085/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com