代码之家  ›  专栏  ›  技术社区  ›  Woody1193 Nimmi Rashinika

计时器中的自动设置行为。计时器

  •  0
  • Woody1193 Nimmi Rashinika  · 技术社区  · 6 年前

    我有一个计时器,它和一个ui元素的行为联系在一起,这样ui元素在30秒后会自动隐藏自己。在那之后,它只应该通过显式调用 Show 在元素上。我执行如下:

    Private Sub myBtn_VisibleChanged(sender As Object, e As EventArgs)
        _myBtn.Enabled = True
        _myTmr.Start()
    End Sub
    
    Private Sub myTmr_Elapsed(sender As Object, e As EventArgs)
        _myBtn.Hide()
        _myBtn.Enabled = False
        _myTmr.Stop()
    End Sub
    

    _myBtn VisibleChanged 上述方法处理的事件和 _myTmr 设置方式是:

    Dim _myTmr As System.Timers.Timer = New System.Timers.Timer(30000.0)
    _myTmr.AutoReset = False
    _myTmr.Enabled = False
    AddHandler _myTmr.Elapsed, AddressOf myTmr_Elapsed
    

    关于这个设置,我有几个问题:

    1. 我需要设置吗 _myTmr.Enabled False 初始化时还是默认行为?我对此不确定,也无法找到关于这一点的说明文件。
    2. 如何 AutoReset 物业工作?是否将其设置为 意味着 Elapsed 只会被提升一次?在这种情况发生后,计时器的值是什么?将呼叫 Start MyTMR 再次,原因 逝去 再长大一次?
    3. 看来 myTmr_Elapsed 抛出一个 InvalidOperationException 因为 逝去 事件是从与UI线程不同的线程引发的。有打电话的方法吗 Hide 在用户界面线程上?
    1 回复  |  直到 6 年前
        1
  •  0
  •   Woody1193 Nimmi Rashinika    6 年前

    在做了进一步的研究之后,我发现了一些事情。

    1. 我不应该用 System.Timers.Timer 因为它不会在UI线程上操作,所以任何需要绑定到计时器的UI工作 Elapsed 事件将引发 InvalidOperationException . 更确切地说, System.Windows.Forms.Timer 应该使用。
    2. 正如我发现的 here 设置 Enabled 如果设置为“真”,则会重置计时器,因此会发出咔嗒声。 Start 也应该这样做。自从 Windows.Forms.Timer 没有 AutoReset 属性,此时它的行为有点静音。