使用Timers会对应用程序产生负面影响吗?

时间:2013-01-14 14:49:16

标签: vb.net

我想知道Timer组件以及由于其使用或其使用的多个实例而产生的负面影响(如果有的话)。在实践中,是否应该限制一次应该在项目中使用多少计时器?

2 个答案:

答案 0 :(得分:13)

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

因此,非常严格的上限是您永远不会有超过10,000个启用的计时器。 Windows拒绝允许应用程序创建那么多窗口。考虑到在一个桌面会话中运行的所有进程的所有窗口都需要共享一个公共堆,您应该远离该限制。或者换句话说,创建大量窗口但仍然低于10,000配额会对其他进程产生负面影响,它可能会在堆耗尽时使它们失败。

我会说一个合理的上限徘徊在100左右。假设所有这些计时器都有不同的Tick事件处理程序,那么通常会记录大量的移动部件。如果他们没有,那么你应该以不同的方式解决这个问题,你只需要一个计时器来测量任意个数量的间隔。大致相同的方式是在手腕上使用单个手表预约。您可以通过在SortedList中存储到期时间来启动计时器,并仅为第一个到期时启动计时器。当它勾选时,处理列表中具有到期时间并重复的条目。当您添加或删除到期时间时,请停止计时器并在新的第一个到期时间重新启动它。

答案 1 :(得分:0)

我假设你的意思是winforms计时器对象所以,

来自文档:

  

Timer用于以用户定义的间隔引发事件。这个   Windows计时器专为UI的单线程环境而设计   线程用于执行处理。它需要用户代码   有一个UI消息泵可用,并始终使用相同的操作   线程,或将调用封送到另一个线程。

     

当你使用它时   timer,使用Tick事件执行轮询操作或显示   一段特定时间的闪屏。每当启用   property设置为true,Interval属性大于   为零,Tick事件基于Interval按间隔引发   物业设置。

因此,如果您开始使用计时器打包应用程序,请逐行阅读,您很快就会在间隔事件中竞争UI渲染时间。

例如:您有一个使用计时器运行时钟的时钟应用程序。在每1秒间隔,您有应用程序渲染手。

在此应用程序中,您还可以让用户根据需要定义尽可能多的“警报”。每个人创建一个将在设定时间触发的新计时器。这些警报也允许循环。也就是说,您允许用户设置每隔x秒发出一次“警报”。

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

这些计时器的行为对于此应用程序来说是不够的,因为会发生以下情况:

  • 在执行'闹钟'
  • 期间,时钟将停止渲染
  • 警报可能会相互运行,因此它们会排队,但是当它们应该发生时不会发生,因为UI线程正在同步处理所有消息。
  • 你最终会得到一个没有响应的用户界面,而这个用户界面并没有达到你想要的效果。

所以尽可能地回答你的实际问题;不一定需要对计时器的数量进行限制,只需要考虑计时器与处理事件处理程序所需的时间之间的间隔。

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

简而言之:

负面影响:

  • 计时器在UI线程中运行,因此阻止
  • 如果间隔时间短于处理事件处理程序所需的时间,则可能会出现意外行为。

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

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