了解C#中Timer控件的工作原理

Ali*_*Ali 2 .net c# timer

假设我有一个定时器控件,间隔设置为20ms.在这个控件里面,我正在做一些需要100ms才能完成的操作.所以一旦它进行了那个操作,Timer控制器会再次执行而不等待该操作完成吗?或者直到该操作没有完成,Timer才会再次执行?

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

And*_*ber 5

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

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

解决方案是对其进行编码,使得无法执行并发执行.

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

上一个答案

当我以为你在System.Windows.Forms中谈到Timer并在Windows Forms程序中使用它时,这是我发布的旧答案.因为情况并非如此,以下信息不适用于您.但我把它留在这里以防它帮助其他人.

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

因此,您希望这样做.你的程序会锁定.

  • 这正是我怀疑Timer正在运行重叠操作,因为我得到了意想不到的行为.根据你的输入我修改了我的代码(我使用你的建议的第2点为启用和禁用计时器),现在它完美地工作.我已将您的答案标记为已接受.谢谢. (2认同)