1

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

4

3 回答 3

2

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

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

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

对您的应用程序进行压力测试。在它开始崩溃或变得如此缓慢以至于无法使用之前,看看您可以激活多少控件。WM_TIMER很有可能,在您用完其他资源之前很久,您就会遇到消息内部处理的开销会影响性能的地步。

于 2009-01-24T20:30:21.270 回答
1

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

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

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

于 2009-01-24T20:31:00.053 回答
1

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

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

于 2009-01-24T20:43:12.167 回答