为什么我的命令不能立即执行,除非我使用MessageBox.Show()?
问题描述:
我正在开发一个控制硬件设备的Windows Forms应用程序。我有一个关闭设备的按钮。点击事件如下所示:为什么我的命令不能立即执行,除非我使用MessageBox.Show()?
Private Sub btnTurnOff_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnTurnOff.Click
device.SetOff() 'Turn off the device
system.threading.thread.sleep(2000) 'Pause for 2 seconds
End Sub
奇怪的是,该设备直到2秒后才关闭。暂停,但如果我在SetOff()命令后立即插入MessageBox,则设备会在2秒之前立即关闭。暂停:
Private Sub btnTurnOff_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnTurnOff.Click
device.SetOff() 'turn off the device
MessageBox.Show("Device is now off")
system.threading.thread.sleep(2000) 'Pause for 2 seconds
End Sub
为什么这段代码的行为是这样的?
答
因为你睡觉的线程...
所以程序什么也不做两秒钟。添加消息框使程序继续,然后,线程进入休眠状态。
答
线程在睡觉时什么也不做,它在那里发生。 当您显示消息框时,线程仍在运行。
尝试快速测试,像
For i As Integer = 0 To 100
system.threading.thread.sleep(20)
Next
一个更好的办法是
Do While [Device Is On]
system.threading.thread.sleep(100)
Loop
一个更好的方法是,如果device.SetOff()将调用一个事件,当它完成了什么它在做。
'MessageBox.Show'被阻塞,所以直到你点击“OK”,它才会进入'Thread.Sleep'。 – vcsjones 2012-03-21 19:04:04