【问题标题】:Enabling an already enabled timer启用已启用的计时器
【发布时间】:2016-04-15 09:27:29
【问题描述】:

我有一个程序,可用作我的 arduino 运动检测器的监控软件,我正在通过计时器请求传感器数据。我已经做到了,因此必须通过按钮明确重置警报。因此,我的问题是;是否要在更改检测变量之前将计时器的启用设置为 false,然后启用它?

tl;dr 当你启用一个已经启用的计时器时会发生什么?是坏了还是只是重置了?

【问题讨论】:

  • 你为什么不先试试,然后来这里?
  • "启用已启用的计时器会发生什么情况?" 没有。 它会重置吗? 不会。
  • 什么样的定时器?有一个表单计时器、一个系统计时器、一个线程计时器……所有这些都有很好的文档来涵盖此类问题。此外,它非常容易测试。
  • @nikhilvartak, itsme86,实际上我做到了。我只是想知道它是否不是最佳的。仅仅因为两者都做同样的事情并不意味着它们注定要以这种方式或其他方式使用。我不是在问我是否可以启用 ian 启用的计时器。我要问的是,如果在更深层次上,不仅仅是“它似乎有效”,会发生什么。如果这触发了你——那我真的很抱歉。不过还是谢谢。
  • @IvanStoev 谢谢。

标签: c# winforms timer


【解决方案1】:

在 System.Windows.Forms.Timer 的实例上设置 Enabled 属性不会重置计时器。仅当您分配给 Enabled 的值与当前值不同时,计时器的状态才会发生变化,即:当前为 False 并且您将其设置为 True 或当前为 True 并且您将其设置为 False。

在幕后,发生的第一件事是在对象上获得排他锁。在 .Net 2 和 3.5 中,这是通过使用 Lock Statement 来完成的。在 .Net 4 中,这是使用 Monitor Class 或更具体地说是 Monitor.Enter() 方法完成的。成功获取锁后,将执行检查以确定新分配的 Enabled 值是否与当前值不同。

此信息是通过反编译 System.Windows.Forms.dll 程序集获得的。我会发布代码 sn-p 但我不确定这样做的合法性。

总而言之,当定时器已启用时,可以将定时器设置为 Enabled = true,但您需要注意,每次这样做时都会请求独占获取对象。

【讨论】:

  • 很好的答案。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多