【问题标题】:Understanding working of Timer control in C#了解 C# 中计时器控件的工作原理
【发布时间】:2012-01-25 04:32:10
【问题描述】:

假设我有一个间隔设置为 20 毫秒的计时器控件。在这个控件中,我正在做一些需要 100 毫秒才能完成的操作。那么一旦它执行了该操作,Timer 控件是否会再次执行而不等待该操作完成?或者直到那个操作没有完成,Timer才不会再次执行?

编辑
我在控制台应用程序的单独线程中使用 System.Timers.Timer()。在与下面的 Andrew 讨论后,我编辑了我的问题。

【问题讨论】:

  • 哪个Timer 控制?其中至少有 4 个。控件的完全限定名称是什么?

标签: c# .net timer


【解决方案1】:

System.Timers.Timer 在“随机”线程池线程上运行和引发事件。回调和计时器滴答声将同时运行,这意味着在间隔小于方法终止时间的情况下,您将重叠执行这些事件。

即使这种行为与我在下面发布的不同,您仍然不想这样做。结果将是线程池最终将耗尽。它也可能不是您想要的功能。

一种解决方案是对其进行编码,使并发执行是不可能的。

  1. 测试一些静态字段以查看现有迭代是否正在运行,如果是,则取消“新”实例。应通过内存屏障测试/设置此类字段。
  2. 进入事件后停止计时器,运行代码,然后重新启动。如果您愿意,可以根据执行所需的时间调整间隔。
  3. 在之前的执行完成之前,不要使用简单的锁定来阻止并发执行;这将回到我用 Windows 窗体计时器描述的问题(减去 UI 锁定)

上一个答案

当我以为您在谈论 System.Windows.Forms 中的计时器并在 Windows 窗体程序中使用它时,这是我发布的旧答案。因为情况并非如此,所以以下信息不适用于您。但我把它留在这里以防它帮助别人。

因为 System.Windows.Forms 命名空间中的 Timer 控件在 UI 线程上运行,它的回调也是如此,因此您的滴答事件将堆积起来,等待当前正在执行的操作完成。您的 UI 也将被锁定在持续时间中。

因此,您确实想要这样做。您的程序将被锁定。

【讨论】:

  • 所以如果我理解正确的话,你的意思是说一旦操作完成,Timer控件会等到完成再执行,而不是不等操作完成再执行反正又来了?顺便说一句,我在一个单独的线程中的控制台应用程序中使用 Timer 控件。
  • 其实,你现在说的话可能会改变一切。当您说“计时器控件”时,您是指可以拖放到 Windows 窗体上的计时器吗?它的完整命名空间是什么?当您说“控制”时,我假设您在 Windows 窗体应用程序中使用它。
  • 哦,我正在使用“System.Timers.Timer()”
  • 这正是我怀疑 Timer 正在运行重叠操作,因此我得到了意外的行为。根据您的输入,我修改了我的代码(我正在使用您建议的第 2 点来启用和禁用计时器),现在它可以完美运行。我已将您的答案标记为已接受。谢谢。
【解决方案2】:

在单线程应用程序中,如果无法执行,滴答声将排队。它还具有~55ms的分辨率

http://msdn.microsoft.com/en-us/library/xdh6857z.aspx

How to prevent System.Timers.Timer from queuing for execution on a thread pool?

【讨论】:

    【解决方案3】:

    System.Timers.Timer

    .NET Framework 文档是指 System.Timers.Timer 类作为基于服务器的计时器,经过设计和优化以供使用 在多线程环境中。这个计时器类的实例可以是 从多个线程安全访问。不像 System.Windows.Forms.Timer,System.Timers.Timer 类将通过 默认情况下,在获得的工作线程上调用您的计时器事件处理程序 来自公共语言运行时 (CLR) 线程池。

    更多定时器类型请参考链接http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

    注意:前面的示例是假设计时器实例是 System.Windows.Forms.Timer 编写的,但作者的说明表明使用了 System.Timers.Timer() 实例。 p>

    【讨论】:

    • 如果在按钮点击事件之前消息队列中已经堆积了多个tick事件怎么办?它还取决于您的滴答间隔。
    • @AnandPatel 是的,这是一个很好的观点。这里我假设滴答间隔是 20 毫秒。
    • 这就是“删除”链接的用途。编辑答案说它不再适用是毫无意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2016-02-20
    • 2012-12-11
    • 2011-02-18
    • 2018-02-17
    • 1970-01-01
    相关资源
    最近更新 更多