【问题标题】:.NET How many listeners can an event have?.NET 一个事件可以有多少个侦听器?
【发布时间】:2012-11-11 18:07:39
【问题描述】:

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

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

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

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

谢谢, 里克

【问题讨论】:

  • 这真的不是很难用一个临时程序来衡量。

标签: .net events


【解决方案1】:

好吧,这里有一些代码可以为委托添加一百万个处理程序,并且运行良好:

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 的响应式扩展而不是原始事件来处理您的事件。使用委托在您所说的规模上执行任何类型的聚合和过滤都会变得异常困难。

【讨论】:

    【解决方案2】:

    一个事件可以拥有多少个侦听器有限制吗?

    你有多少内存? ;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 系统。董事会可以订阅他们感兴趣的火车(或线路),而火车(或线路)只是向那些指定的频道广播。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 2023-04-06
      • 2011-09-06
      相关资源
      最近更新 更多