定时器可在BackgroundWorker的停止,但不能启动(Timer can be stoppe

2019-10-18 14:10发布

最近,我一直在用system.form.timerUI thread 。 我注意到,虽然我可以停止在后台线程的计时器,我不能重新启动它,除非我使用BeginInvoke ,即使我没有收到cross-threading exception 。 在system.timers.timer但是似乎我可以停止和由定时器产生的后台线程启动它。 为什么是这样? 是system.form.timer允许被停止,但不是从后台线程启用? 这似乎有点奇怪我。

System.Form.Timer代码

不工作

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim BW As BackgroundWorker = New BackgroundWorker
    AddHandler BW.DoWork, AddressOf CheckTimer
    BW.RunWorkerAsync()
End Sub

Private Sub CheckTimer()
    Timer1.Stop()
    Timer1.Start()
    MsgBox("Stopped and Started Timer")
End Sub

作品

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim BW As BackgroundWorker = New BackgroundWorker
    AddHandler BW.DoWork, AddressOf CheckTimer
    BW.RunWorkerAsync()
End Sub

Private Sub CheckTimer()
    Timer1.Stop()
    Me.BeginInvoke(New TimerStart(AddressOf TimerStartFunction))
    MsgBox("Stopped and Started Timer")
End Sub

Private Delegate Sub TimerStart()

Private Sub TimerStartFunction()
    Timer1.Start()
End Sub

System.Timers.Timer代码

作品

Dim aTimer As System.Timers.Timer

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    aTimer = New System.Timers.Timer(5000)
    AddHandler aTimer.Elapsed, AddressOf OnTimedEvent
    aTimer.Enabled = True
End Sub

Sub OnTimedEvent()
    aTimer.Stop()
    aTimer.Start()
    MsgBox("Stopped and Started Timer")
End Sub

Answer 1:

在的WinForms Timer类是有些线程安全的,不足以让你快乐。 当你调用它的start()方法,那么它会创建一个变成WM_TIMER消息转换成蜱事件隐藏的窗口。

当你做这个工作线程,那么你往往有一个问题,当线程运行一个消息循环,这些WM_TIMER消息,仅调度。 工作线程通常不这样做,他们不叫Application.Run()。 因此,计时器就不会打勾。

调用stop()方法,否则好的,它知道如何找到那个隐藏窗口后竟然通过代码错误的线程上运行。 你的BeginInvoke()找到了变通办法,因为它现在可以正确地在UI线程调用start()和获取与正确的所有者线程,一个泵创建隐藏的窗口。 System.Timers.Timer没有这个问题,它不依赖于WM_TIMER打勾,但使用System.Threading.Timer代替。 这是由CLR管理的专门工作线程的支持。 请注意,此计时器相当危险。 在工作线程调用MSGBOX()是根本错误的,换一个。 高赔率用户永远看不到它,因为这将是后面的UI窗口。

这可以解释它,我不能以其他方式提供更好的建议,因为我看不到你真正要做的。 要小心,你是在玩火。



文章来源: Timer can be stopped in backgroundworker, but can't be started