Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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#_Multithreading - Fatal编程技术网

C# 是否值得为每个数据包句柄创建新线程?

C# 是否值得为每个数据包句柄创建新线程?,c#,multithreading,C#,Multithreading,我有一个c#服务器,它有一个数据包处理程序,可以像这样处理客户端数据包: for (int i = 0; i < packets.Count; i++) { new Thread(new HandlePacket(packets[i].bytes, packets[i].count).handle).Start(); } for (int i = 0; i < packets.Count; i++) { Task.Run(() => new HandlePacke

我有一个c#服务器,它有一个数据包处理程序,可以像这样处理客户端数据包:

for (int i = 0; i < packets.Count; i++)
{
   new Thread(new HandlePacket(packets[i].bytes, packets[i].count).handle).Start();
}
for (int i = 0; i < packets.Count; i++)
{
   Task.Run(() => new HandlePacket(packets[i].bytes, packets[i].count).handle).Start());
}
Parallel.ForEach(packets, (item) =>
{
    new HandlePacket(item.bytes, item.count).handle();
});
for(int i=0;i
通常句柄数据包有很多代码要执行(数据包id上的depands,有时甚至是嵌套循环),线程是为了防止挂起(或长时间执行)数据包处理程序,因为一个数据包句柄有时可以执行嵌套循环

for (int i = 0; i < 32; i++)
{
   for (int j = 0; j < 8; j++)
   {
      for (int k = 0; k < 32; k++)
      {
      }
   }
}
for(int i=0;i<32;i++)
{
对于(int j=0;j<8;j++)
{
对于(int k=0;k<32;k++)
{
}
}
}
这样做有效率吗? 如果不是,有什么替代方案可以防止挂起数据包处理程序线程

服务器用于游戏,长时间执行(或挂起)是不可接受的


此外,每个服务器都有32个数据包处理程序(为每个客户端保留一个)

如果使用
任务
类,则允许运行时确定如何使用线程并行运行代码

你可以这样做:

for (int i = 0; i < packets.Count; i++)
{
   new Thread(new HandlePacket(packets[i].bytes, packets[i].count).handle).Start();
}
for (int i = 0; i < packets.Count; i++)
{
   Task.Run(() => new HandlePacket(packets[i].bytes, packets[i].count).handle).Start());
}
Parallel.ForEach(packets, (item) =>
{
    new HandlePacket(item.bytes, item.count).handle();
});
for(int i=0;inewhandlepacket(数据包[i]。字节,数据包[i]。计数)。handle.Start());
}
您还可以配置一些其他类似的东西,但这将是
比为每个包启动线程要好得多。

为了在集合上启用数据并行性,可以使用Parallel.ForEach()。 因此,您的代码将如下所示:

for (int i = 0; i < packets.Count; i++)
{
   new Thread(new HandlePacket(packets[i].bytes, packets[i].count).handle).Start();
}
for (int i = 0; i < packets.Count; i++)
{
   Task.Run(() => new HandlePacket(packets[i].bytes, packets[i].count).handle).Start());
}
Parallel.ForEach(packets, (item) =>
{
    new HandlePacket(item.bytes, item.count).handle();
});

我不建议直接处理线程。看看线程池和基于任务的并行库(),最好保留一定数量的线程,并根据需要分配它们。我不会为传入的每个数据包生成一个新线程,因为这可能是不可能的。将数据包放入队列,并在它们可用时为它们提供线程。您可以使用不同大小的线程池。请回答“这样做是否有效?”为了并行处理数据集合,这是最有效的方法。您可以使用具有内部类的
Parallel.ForEach
,该类将创建并发运行的小批,而不是为集合中的每个项分配单个新任务(如果您使用
task.Run()
task.Factory.StartNew()
)或线程。您可以拥有的最大批次数等于集合中的项目数。这仍然不能回答问题。为什么?您不能使用任何其他方法并行处理任何数据集合,这些方法比
并行处理方法更快,并且比
并行处理方法更好地使用资源。因此,这是最有效的方法。问题是OP的方法是否有效。你刚刚用你认为更有效的方法回答了这个问题。你没有限定或量化OP的方式效率低多少,或者如果它效率低。请回答问题“做这样的事情有效率吗?”