【问题标题】:C# - Iterate through form components (not controls)C# - 遍历表单组件(不是控件)
【发布时间】:2013-10-26 01:53:20
【问题描述】:

我的表单有许多计时器组件,我希望在运行时循环这些组件。我的目标是立即停止表单上的所有计时器。

我尝试调整一些代码,我必须对控件执行相同的操作,但它似乎不起作用。

foreach (var tmr in this.components.Components.OfType<Timer>())
{
    tmr.Stop();
}

任何帮助将不胜感激。

【问题讨论】:

  • “它似乎不起作用” 不是有效的问题陈述。
  • 定时器是如何创建的?
  • 什么是this,什么是components
  • 你有没有在tmr.Stop() 上设置断点,看看它是否真的被调用了?
  • 停止意味着不创建任何新的定时器消息。但是任何之前仍在消息队列中的 WM_TIMER 消息都会被处理。

标签: c# winforms timer components


【解决方案1】:

停止 Winforms 计时器意味着不再将计时器消息 (WM_TIMER) 发布到消息队列中。但是仍然在消息队列中的任何先前的 WM_TIMER 消息都将被处理。因此,即使在 Timer 停止后,当您更快地创建 Timer 消息时,也可能会处理多个 Tick 事件,然后它们可以被处理。

更新: 检查源代码显示,Winforms 计时器在计时器停止时会吞下 WM_TIMER 消息,并且不会触发任何 Tick 事件。所以这不是正确答案。

【讨论】:

  • 不,肯定不会超过 1。WM_TIMER 是通过在空队列上轮询计时器生成的(非常低优先级)。
  • @HenkHolterman 实际上(我已经查找了源代码)Winforms Timer 窗口进程在停止时只会吞下 WM_TIMER 消息。因此,无论发送多少 TIMER 消息,Timer 都不会触发 Tick 事件。关于删除标记为已接受但错误的答案的共识是什么?我应该吗?
  • 您现在不能删除它,如果您真的想删除它,请将其标记为模组。但是插入您的疑问的编辑也是可以的。
  • 只要改变它就可以解决我的问题,怎么会出错? ://
  • @MrWednesday - 那么你的问题不是你想象的那样。你可能还不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 2013-11-20
  • 2023-01-09
相关资源
最近更新 更多