【问题标题】:How to prevent a Tick event after a Timer has already been initiated如何在 Timer 已启动后防止 Tick 事件
【发布时间】:2015-12-12 07:59:55
【问题描述】:

所以我有一个我要调用 time 的 Timer 对象,并且 time 有一个在 60 秒后调用的滴答事件。我正在尝试使用 time.Stop() 方法,但仍调用 time_Tick()。如何防止 Tick 方法发生?一旦计时器启动,就没有办法退出了吗?谢谢!我是 Tick 事件的新手。

【问题讨论】:

  • Timer.Stop() 应该停止计时器,因此不会引发 Tick 事件。您可能希望显示您的代码,以便人们可以在那里查找错误。
  • 为了我公司的隐私,我恐怕不能。我会深入挖掘一下,看看 Timer 是否被另一个线程或其他东西重新启动。感谢您的评论。将time.Enable设置为false会有同样的效果吗?
  • 看看:referencesource.microsoft.com/#System.Windows.Forms/winforms/… 第 243 行。 StartStop 仅设置 .Enabled 属性。它的设置器(第 157 行++)然后完成工作。
  • 您正在使用System.Windows.Forms.Timer? .NET 框架中有几个名为Timer 的类..

标签: c# .net


【解决方案1】:

定时器滴答可以在定时器停止后同时到达(出于基本原因)。在您停止计时器之前,滴答声可能会排队。

如果您想可靠地停止计时器,请设置一个布尔标志并在滴答事件处理程序中检查该标志。如果已设置,请忽略勾号。

您需要同步对该标志的访问。

【讨论】:

    【解决方案2】:

    如果您有其他计时器对象,您可能会看到this

    在 Windows 窗体应用程序中的任何 Timer 上调用 Stop 会导致来自应用程序中其他 Timer 组件的消息立即得到处理,因为所有 Timer 组件都在主应用程序线程上运行。如果您有两个 Timer 组件,一个设置为 700 毫秒,一个设置为 500 毫秒,并且您在第一个 Timer 上调用 Stop,您的应用程序可能首先收到第二个组件的事件回调。如果这证明有问题,请考虑改用 System.Threading 命名空间中的 Timer 类。

    【讨论】:

    • 你是绝对正确的。经过一番调试,我发现我在这个问题中提到的计时器正在被代码中另一个更通用的计时器重新启动。谢谢。
    • 没有一个 BCL 计时器支持可靠地停止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多