2013-01-14 75 views
5

我想知道有关Timer成分,什么,如果有的话,因为它的使用或其使用的多个实例的发生负面影响。在实践中,一次应该在项目中使用多少个定时器应该有限制?使用计时器是否对应用程序有负面影响?

+0

downvotes。为什么?好问题,+1 –

+0

“这个问题基本上没有显示任何研究成果”。 – asawyer

+0

@asawyer你如何研究这个?尝试它是不可靠的,不能一概而论。试试Google的主题。你会发现这个问题,而不是别的。 –

回答

11

好吧,一切都是相对的,但System.Windows.Forms.Timer是一个相当昂贵的对象。它的工作原理是创建一个隐藏的窗口,使底层winapi SetTimer()函数可以工作。该窗口不共享,每个计时器对象都有自己的窗口。窗口通常是更昂贵的操作系统对象之一。

所以一个非常困难的上限是你永远不能有超过10,000个启用的定时器。 Windows拒绝允许应用程序创建多个窗口。考虑到在一个桌面会话中运行的所有进程的所有窗口都需要共享一个共享堆,您应该停留在该限制以南。换句话说,创建大量窗口但保持低于10,000配额可能会对其他进程产生负面影响,但当堆耗尽时,可能会使其失败。

我会说一个合理的上限徘徊在100这是一个大量的运动部件一般保持跟踪的,假设所有这些计时器有不同的Tick事件处理程序。如果他们不那么你应该以不同的方式解决这个问题,你只需要一个定时器来测量一个任意数量的间隔。您通过将到期时间存储在SortedList中并仅为第一个到期的计时器启动计时器。当它打勾时,处理列表中有过期时间并重复的条目。当您添加或删除到期时间时,停止定时器并在新的第一次到期时间内重新启动它。

+0

+1我不知道10,000窗口的限制。 –

0

我假设你指的是的WinForms计时器对象,因此,

从文档:

使用定时器,以提高在用户定义的时间间隔的事件。这个 Windows计时器专为线程用于执行处理的单线程环境而设计。它要求用户代码 有一个UI消息泵可用,并始终从相同的 线程运行,或将呼叫编组到另一个线程。

当您使用此 计时器时,使用Tick事件执行轮询操作或在指定的时间段内显示 启动屏幕。每当启用 属性设置为true,并且Interval属性大于零 ,Tick事件在基于区间 属性设置间隔提高。

所以读通过行线,如果你开始收拾与计时器您的应用程序,你很快将要为比赛渲染UI的时间间隔事件。

例如:你有一个使用定时器运行时钟的时钟应用。在每隔1秒的时间间隔内,您的应用程序将呈现手部。

在这个程序,你也让用户定义尽可能多的“报警”,因为他们想要的。每一个创建一个新的计时器,将在设定的时间触发。这些警报也可以是周期性的。也就是说,您允许用户设置每隔x秒熄灭一次的“警报”。

现在假设用户有一个长期运行的任务(Access数据库,网络资源,计算圆周率到1500个字符等)上周期性发生报警。现在假设用户有10个长时间运行的任务需要按顺序发生,并且需要以3 4和5秒的间隔发生。

这些计时器的行为不会为这种应用是足够的,因为下面会发生:

  • 时钟将停止“警报”
  • 报警的执行过程中渲染可以在一个运行另一个,因此他们会排队,但不应该发生,因为UI线程正在同步处理所有消息。
  • 你最终会遇到一个没有响应的用户界面,它不会做你想做的事。

所以作为最好的回答我可以在你的实际问题;对于定时器的数量不一定有限制,只需要考虑处理事件处理程序所需的时间与它们何时会触发的时间之间的时间间隔。

如果您正在使用定时器来触发将最终返回到UI线程并进行更改的单独处理线程,那么在您运行到该线程的上端之前没有可行的限制目标机器的性能。也就是说,在某些时候,定时器的数量可能非常大,以至于您调用更多定时器事件并堵塞消息队列,以致表单渲染受到影响。

因此,在短期:

负面影响:

  • 计时器在UI线程运行,因此它们都是阻塞
  • 他们可以有意外的行为,如果你的间隔比的时间量较短它需要处理你的事件处理程序。

在实践中,您应该需要限制定时器使用的唯一时间,就像用户无法控制的任何组件一样,如果它们开始影响用户体验。

我希望阅读的时间比写作时的感觉少得多。

+1

55毫秒的准确性钞票严重过时。这可以追溯到Windows 98,在所有现代版本的Windows上,它是1/64秒或更好。 –

+0

为什么它们似乎只更新MSDN上的最小值?感谢您的澄清。 –

相关问题