【问题标题】:System.Windows.Forms.Timer performanceSystem.Windows.Forms.Timer 性能
【发布时间】:2009-06-25 01:48:09
【问题描述】:

我们有一个应用程序包含许多基于 System.Windows.Forms.Timer 频繁更新的用户控件。我可以安全地将 Timer 实例添加到每个控件的性能上吗?或者我应该有一个一直运行的单例计时器,供所有实例使用吗?幕后究竟发生了什么?每个计时器都会有一个额外的线程(用于计数)吗?

【问题讨论】:

    标签: .net winforms timer


    【解决方案1】:

    System.Windows.Forms.Timer 是通过良好的 ol' User32 Timers 实现的。因此,它们不使用或不需要单独的线程进行操作。也就是说,它们是一种有限的资源,因为你不能拥有无限数量的它们。

    当您说您有 很多 个使用计时器的用户控件时,“很多”的真正含义是什么? 10? 10000?

    当您说他们经常更新时,您的真正意思是什么?每一分钟?每 100 毫秒?他们的计时器可以触发多快?

    对您的应用进行压力测试。在它开始崩溃或变得如此缓慢以至于无法使用之前,看看你可以激活多少控件。很有可能,在您耗尽其他资源之前,WM_TIMER 消息的内部处理开销会导致性能下降。

    【讨论】:

      【解决方案2】:

      没有额外的线程。您的线程的消息队列中只有很多 WM_TIMER 消息。所以这些计时器不会并行执行它们的代码,即使它们的时间跨度重叠。

      我认为为每个控制设置一个单独的计时器并没有什么坏处。至少与使用单个计时器相比,它肯定不会有任何可衡量的性能差异。不过,代码将变得更具可读性。 ;)

      顺便说一句 - 随着今天大规模迁移到多个 CPU 内核,考虑一下这可能不是您可以从中受益的地方。

      【讨论】:

        【解决方案3】:

        每个控件的计时器是否在不同的时间触发?他们每个人都需要一个单独的计时器吗?

        请记住,您可以将多个事件处理程序连接到一个事件,因此如果您使用计时器来制作一些简单的动画,您也许可以使用一个计时器为多个控件触发事件...

        【讨论】:

          猜你喜欢
          • 2013-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多