【问题标题】:How many System.Timers.Timer instances can I create? How far can I scale?我可以创建多少个 System.Timers.Timer 实例?我可以扩展多远?
【发布时间】:2021-03-15 22:36:09
【问题描述】:

我有一个应用程序,它使用System.Timers.Timer 对象来执行过期和电子邮件通知等。目前系统同时有几百个定时器,但我们将扩大应用程序的使用范围,这个数字可能会开始扩展到数千个(可能不超过 10,000 个)。

我找不到任何关于增加定时器数量的信息,所以我认为这不会成为问题。有谁知道这是否会成为一个问题,我应该主动考虑改变我处理过期的方式吗?

【问题讨论】:

  • 我有一个关于 Threading.Timer 的类似问题。
  • 如果您有兴趣,可以通过在系统 DLL 上使用反射器来查看计时器类所依赖的基本操作系统资源。然后向 Mark Russinovich blogs.technet.com/b/markrussinovich 提出问题
  • @GregC,你能发个链接让我看看这些答案吗?

标签: .net timer


【解决方案1】:

这有点晚了,我知道,但是。 . .

System.Timers.Timer 是 System.Threading.Timer 的包装器,而后者又是 Windows 的 Timer Queues 的 .NET 包装器。定时器队列定时器是非常轻量级的——使用很少的系统资源。我没有扩展到数千个定时器,但数百个定时器工作得很好。根据我对实现的了解,我无法想象成千上万的计时器会有任何问题。

在任何特定计时器队列中可以拥有的计时器数量可能存在一些限制。我不知道这个限制是什么。当我大约一年前调查这些计时器时,看起来 .NET Framework 为每个进程(或者可能是每个应用程序域)创建了一个计时器队列,并且您创建的所有计时器都放入了该队列中。

通过创建您自己的系统来复制计时器队列功能可能没有意义,该系统使用单个计时器和某种类型的优先级队列机制来控制接下来调用的内容。这就是定时器队列已经为你做的事情了。

您似乎可以轻松构建一个创建 10,000 个计时器的测试程序。将每一个设置为在最后一个后一秒打勾,并将其周期设置为 10,000 秒。然后坐下来看着它滴答作响。或者让您的程序跟踪谁应该下一个打勾以及谁实际上下一个打勾。

【讨论】:

    【解决方案2】:

    只使用一个计时器不是更好吗?此计时器触发 e。 G。每秒或每分钟,然后将 DateTime.Now() 与 Schedule Plan 的 Setpoint DateTime 对象进行比较。 如果 Setpoint DateTime 对象与 DateTime.Now() 匹配,则触发一个事件并为您的对象重新计算下一次执行 DateTime。

    【讨论】:

    • 这让我印象深刻,因为它实现了我自己的计时器。我不记得我在 2010 年的工作是什么让我以这种方式使用 Timers,但如果 Timers 提供的抽象是我想要的,我显然希望避免实施我自己的“调度计划”:)跨度>
    【解决方案3】:

    只使用一个计时器怎么样?计时器将在第一次到期时到期,并在到期时执行适当的逻辑。然后将其间隔重置为下一次到期?可能只是另一种只使用一个计时器来处理过期的方法。

    【讨论】:

    • 显然有很多方法可以不使用大量计时器。但是,我想知道是否值得更改代码。
    【解决方案4】:

    大量使用它们应该没问题。但就像 pdiddy 所说,如果可以的话,你真的应该考虑改变你的代码。 1 对 10.000 个计时器会有所不同。 ;-)

    【讨论】:

      猜你喜欢
      • 2018-07-14
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      相关资源
      最近更新 更多