我正在编写一个模拟火车和火车站出发板的软件。火车存储的时间提前了多少分钟。出发板的每个实例都订阅了不断变化的列车子集。
我们正在编写应用程序,以便能够处理成千上万的列车和数十万(可能是数百万)的出发板。
我的计划是使用.NET事件,而不是让列车保留每个订阅出发板的参考列表。每当关于列车的调度的一些信息改变时,列车类的实例引发事件。离境委员会班的每个实例只是为他们订阅的列车添加或删除事件监听器。
活动可以拥有多少听众?如果是这样,限制是什么以及性能如何降低?
谢谢, 瑞克
答案 0 :(得分:2)
嗯,这里有一些代码可以为委托添加一百万个处理程序,并且工作正常:
Action<int> action = n => Console.WriteLine(n);
for (var i = 0; i <= 1000000; i++)
{
var i2 = i;
action += n => Console.WriteLine(n + i2);
}
action(42);
但是,我会考虑使用Microsoft的Reactive Extensions而不是原始事件来处理您的事件。使用委托将难以在您所讨论的规模上执行任何类型的聚合和过滤。
答案 1 :(得分:1)
事件可以有多少听众?
你有多少记忆? ; p就你所说的数字而言,应该没问题 - 但坦率地说,我并不认为这是一个很好的方法。但是:
static void Main()
{
EventHandler handler = null;
for (int i = 0; i < 6000000; i++)
{
var obj = new Spoof();
handler += obj.Bar;
if ((i % 1000) == 0) Console.WriteLine(i);
}
Console.WriteLine("done");
Console.ReadKey();
handler(null, null);
}
class Spoof
{
public void Bar(object sender, EventArgs args) { Console.WriteLine("hi"); }
}
如果是,那么限制是什么以及性能如何降低?
基本上,近似线性。
但是,我真的不认为这种方法是理想的 - 它存在诸如仅限于单个应用程序域(使得难以在节点之间分发)等问题,并且真的使用类似事件时容易出现意外的内存情况。此外,取消订阅将变得非常昂贵,因为它需要扫描订户列表。
个人,我正在使用像redis pub / sub或其他一些专用的pub / sub系统。董事会可以订阅他们感兴趣的火车(或者可能是线路),并且只是将火车(或线路)广播到那些指定的频道。