0

我正在编写一个模拟火车和火车站出发板的软件。火车存储他们提前/落后计划的分钟数。出发板的每个实例都订阅了不断变化的火车子集。

我们正在编写应用程序,以便能够处理数以万计的火车和数十万(可能是数百万)的出发板。

我的计划是使用 .NET 事件,而不是让火车维护对每个订阅出发板的引用列表。每次有关火车调度的某些信息发生变化时,火车类的实例都会引发一个事件。Departure Board 类的每个实例都只是简单地为它们订阅的火车添加或删除事件侦听器。

一个事件可以拥有多少个侦听器是否有限制?如果是这样,限制是什么?性能将如何下降?

谢谢,里克

4

2 回答 2

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 的响应式扩展而不是原始事件来处理您的事件。使用委托将很难以您正在谈论的规模执行任何类型的聚合和过滤。

于 2012-11-23T11:27:46.510 回答
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 系统。董事会可以订阅他们感兴趣的火车(或线路),而火车(或线路)只是广播到那些指定的频道。

于 2012-11-23T11:31:00.723 回答