为什么我的命令不能立即执行,除非我使用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 

为什么这段代码的行为是这样的?

+0

'MessageBox.Show'被阻塞,所以直到你点击“OK”,它才会进入'Thread.Sleep'。 – vcsjones 2012-03-21 19:04:04

因为你睡觉的线程...

所以程序什么也不做两秒钟。添加消息框使程序继续,然后,线程进入休眠状态。

线程在睡觉时什么也不做,它在那里发生。 当您显示消息框时,线程仍在运行。

尝试快速测试,像

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()将调用一个事件,当它完成了什么它在做。

您需要切换两个并将Sleep置于MessageBox之前。

+0

为什么?考虑为OP提供更多信息以跟进。 – rayryeng 2014-05-21 20:52:52