Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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/2/.net/21.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#_.net_Multithreading_Broadcasting - Fatal编程技术网

C# 新线程与跨线程编组的成本

C# 新线程与跨线程编组的成本,c#,.net,multithreading,broadcasting,C#,.net,Multithreading,Broadcasting,所以,我有一个情况,一个事件发生了,然后我需要将它“广播”给几个订阅的“侦听器” 我目前的设计是为每个订户循环,并连续工作,依次通知每个“接收者” 然而,在一些负载/压力测试中,我发现它可能会比我喜欢的更多地排队,在接收者列表中的15个可能会在收到通知之前等待很长时间 我想提供一种让接收者列表或多或少同时接收通知的方法 ThreadPool出局了。我有自己的理由 我关心的是性能。 这是我正在考虑的 A.每次触发事件时,为每个接收器创建一个线程来执行特定于接收器的通知。通知完成时线程将终止。 --

所以,我有一个情况,一个事件发生了,然后我需要将它“广播”给几个订阅的“侦听器”

我目前的设计是为每个订户循环,并连续工作,依次通知每个“接收者”

然而,在一些负载/压力测试中,我发现它可能会比我喜欢的更多地排队,在接收者列表中的15个可能会在收到通知之前等待很长时间

我想提供一种让接收者列表或多或少同时接收通知的方法

ThreadPool出局了。我有自己的理由

我关心的是性能。 这是我正在考虑的

A.每次触发事件时,为每个接收器创建一个线程来执行特定于接收器的通知。通知完成时线程将终止。
----或者--
B.第一次触发事件时,会为每个接收器创建一个线程,但它是一个“无限”线程(有一个使其保持活动状态的循环),通知细节会封送到每个线程,然后这些线程处理新数据


因此,问题是:创建新线程或将数据封送到现有线程的成本是否更高,或者如果同样昂贵,为什么选择一个线程而不是另一个呢?

创建线程而不是使用TP线程在系统资源和时间上都非常昂贵。例如,通过线程安全队列传递数据是可以执行的,前提是您没有将可用的内核(听起来很有可能)最大化,并且接收线程正在阻塞您发出信号的同步对象。典型的线程上下文切换成本在2000到10000个机器周期之间,您可能处于低端,因为线程运行在相同的地址空间中


真正的成本是让这么多线程正确运行而不无休止地追逐竞争和死锁的困难。

您的循环不是造成了繁忙的等待问题吗? 大多数循环的迭代都会浪费CPU周期,因为它们除了在循环中进行一些检查之外,不会做任何有效率的事情。 我可能会坚持使用新线程,因为空闲CPU总是一个糟糕的性能选择


另外,您是否正在实施某种领导人选举算法?

线程池似乎是显而易见的解决方案。你能解释一下为什么它不是一个选项吗?仅供参考:添加了.NET标记,因为这与C#@Peter无关-我更喜欢(在本例中)使用Thread对象,这样我就可以访问Thread对象的各种方法/属性。我喜欢为我的线程设置一个名称,以便于调试/支持。此外,TP线程始终是后台线程,在本例中我不希望出现这种情况。我现在想的是创建我自己类型的线程池,根据内核数量进行定量分配。嗯,现有的线程池也这样做。请结束你的问题。嗯,我的问题还没有得到回答。创建线程与将数据封送到运行线程之间的区别。我在回答中非常明确地提到了这一点。如果你不解释为什么你不清楚,我帮不了你。你自己测量一下,是得到你满意和自信的答案的更好方法。祝你好运。我想我希望简单的“a”更好,因为。。。。我现在认为,我的问题对于这样一个答案的实施来说过于主观。(这是我的第一个问题——如果我结束了这个问题,我可以在以后更新我是如何解决的/我采取的方向吗?我希望其他人从这项工作中受益)