Проблема в том, что ваш пользовательский интерфейс «зависает», пока ваша длинная операция выполняется в потоке пользовательского интерфейса. Вы могли бы решить эту проблему, запустив длительную работу в фоновом потоке, например, с помощью BackgroundWorker
в вашей кнопки обработчик события:
Dim bw As New BackgroundWorker()
AddHandler bw.DoWork,
Sub(sender, args)
' Do your lengthy stuff here -- this will happen in a separate thread.
' If you want to do UI operations here, you need to use Control.Invoke.
End Sub
AddHandler bw.RunWorkerCompleted,
Sub(sender, args)
' We are back in the UI thread here.
If args.Error IsNot Nothing Then ' If an exception occurred during DoWork,
MsgBox(args.Error.ToString()) ' do your error handling here
End If
' Re-enable your button and change the text back here:
...
End Sub
' Disable your button and change the text here:
...
bw.RunWorkerAsync() ' Start the Background Worker
(Конечно, если вам не нравится AddHandler
, используя экземпляр WithEvents
переменная для BackgroundWorker и ключевое слово Handles
так же хороши и более типичны для VB.)
Обратите внимание, что в этом случае пользователь может взаимодействовать с вашим пользовательским интерфейсом во время работы. Это может быть полезно (вы можете добавить кнопку «прерывание», которая устанавливает флаг, который отмечен в вашей длительной операции), но вам нужно убедиться, что не могут произойти какие-либо плохие вещи, например. деактивируйте кнопку, чтобы одна и та же операция не могла быть запущена дважды.
это как Windows работает. Он не может приостановить обработку клика даже для обработки краски, даже если вы вызвали, а затем вернуться туда, где она была остановлена в событии клика. – Plutonix
Если вы публикуете то, что вы пробовали и описываете свою конечную цель, кто-то может предложить альтернативное решение, соответствующее вашим потребностям. –
Попробуйте btw.Refresh() внутри обработчика события. – Ender2050