Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将工作封送到单线程c上#_C#_Multithreading_Marshalling_Single Threaded - Fatal编程技术网

C# 如何将工作封送到单线程c上#

C# 如何将工作封送到单线程c上#,c#,multithreading,marshalling,single-threaded,C#,Multithreading,Marshalling,Single Threaded,我有一个应用程序需要处理UDP广播中的一些数据包,并将结果写入SQL数据库。 在间隔期间,传入数据包的速率非常高,我发现底层缓冲区溢出,即使是8MB,也是因为数据库写入速度慢 为了解决这个问题,我提出了两个选项,缓存一些DB写入, 和/或将db写入封送到另一个顺序操作线程。(必须保留数据库写入的顺序) 我的问题是如何使用c#的内置结构/功能最有效地组织工作 我是否应该有一个同步队列,将代理工作项放到队列中,并在事件循环中为其提供单线程服务?如果您使用的是.Net 4,可以在这里为您提供帮助。在M

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

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

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


我是否应该有一个同步队列,将代理工作项放到队列中,并在事件循环中为其提供单线程服务?

如果您使用的是.Net 4,可以在这里为您提供帮助。在MSDN上,您可以找到。创建一个并发级别为1的单一实例,每次有工作要做时,创建一个任务并使用该调度程序调度它。

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

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


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

您需要聚合DB写入,这样您就不会为接收到的每个包结束一个事务。否则,由于介质的旋转速度,您将被限制在每秒大约30个事务。这里有一个非常基本的数据流问题。线程并不是一个神奇的解决方案,因为您消耗的实际cpu周期太少了。使用TCP而不是UDP将是一个简单的解决方案。或者一个更大的缓冲区,包括写入本地磁盘,假设消防水管关闭足够长的时间,让你赶上。我100%同意David和Hans的观点,(我今天怎么了?)。使用批量更新和/或存储过程修复数据库事务将提高数据库性能,并使您能够及时了解数据。如果没有,那么您将不得不以某种方式应用流控制。我理解UDP广播没有任何流控制的规定,其他广播接收器可能不希望数据速度减慢,但我看不到太多选择。你能把你的DB放在SSD上吗?是的,我们计划把DB放在SSD上,并且给它分配了大量的ram,让它主要在内存中运行。
BlockingCollection<Packet> _packets = new BlockingCollection<Packet>();
...

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