【发布时间】:2009-11-26 02:11:51
【问题描述】:
我有这种情况:一个带有 System.Timer 的表单(AutoReset = False)。表单有它的主线程,定时器也有它自己的线程(这里没有什么新东西)。
当用户按下按钮时,我需要停止计时器,等到计时器线程停止执行并执行更多操作。
另一方面,计时器更新表单中的项目,因此使用 BeginInvoke。代码如下所示:
按键代码:
Private Sub ButtonStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonStop.Click
SyncLock (m_stopLock)
m_stopProcessTimer = True
Threading.Monitor.Wait(m_stopLock)
End SyncLock
''#Do more things here after the timer has end its execution and is stopped
End Sub
定时器代码:
Private Sub m_processTimer_Elapsed(ByVal sender As Object, ByVal e As System.EventArgs) Handles m_processTimer.Elapsed
Dim auxDelegate As EventHandler
SyncLock (m_stopLock)
If Not m_stopProcessTimer Then
If Me.InvokeRequired Then
auxDelegate = New EventHandler(AddressOf m_processTimer_Elapsed)
Me.BeginInvoke(auxDelegate, New Object() {sender, e})
Else
DoFormStuf()
m_processTimer.Start()
End If
Else
Threading.Monitor.Pulse(m_stopLock)
End If
End SyncLock
End Sub
关键是我等待主线程让定时器线程结束它的工作。
问题在于,当用户在调用 BeginInvoke 时单击按钮时,此代码会死锁。像这样简单的事情怎么能做到?看起来我找不到解决这个问题的好方法:(
【问题讨论】:
标签: vb.net multithreading deadlock