Почему моя команда не выполняется немедленно, если я не использую MessageBox.Show ()? - PullRequest
0 голосов
/ 21 марта 2012

Я разрабатываю приложение Windows Forms , которое управляет аппаратным устройством.У меня есть кнопка, которая выключает устройство.Событие щелчка выглядит следующим образом:

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 секунды.пауза, но если я вставлю MessageBox сразу после команды SetOff (), то устройство выключится немедленно, до 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

Почему этот код ведет себя таким образом?

Ответы [ 3 ]

2 голосов
/ 21 марта 2012

Потому что ты спишь нить ...

Таким образом, программы ничего не делают в течение двух секунд. После добавления окна сообщения программа запускается, а после этого поток переходит в спящий режим.

0 голосов
/ 22 мая 2014

Вам нужно переключить два и поставить Sleep перед MessageBox.

0 голосов
/ 22 марта 2012

Нить ничего не делает, когда спит, там что-то напрашивается. Когда вы показываете окно сообщения, поток все еще работает.

Попробуйте быстрый тест, что-то вроде

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 () вызовет событие, когда завершит свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...