Метод Invoke()
Выполняет указанный делегат в потоке, которому принадлежат элементы управления, лежащие в основе дескриптора окна.
Проще говоря, метод Invoke()
должен использоваться при обновлении GUI из другого потока, который не является основным потоком GUI.
Следовательно, если вы обновляете графический интерфейс из основного потока, вам не нужно использовать метод Invoke()
.
Обновления безопасного многопоточного интерфейса
При обновлении GUI из другого потока вы не можете сделать это, потому что Cross-thread exception
будет брошено:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim t As New Threading.Thread(AddressOf changeGUI)
t.Start()
End Sub
Private Sub changeGUI()
Button2.Enabled = False
End Sub
Но при использовании Invoke()
GUI будет безопасно обновляться с помощьюделегат, так что вы должны сделать это так:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim t As New Threading.Thread(AddressOf changeGUIThreadSafe)
t.Start()
End Sub
Private Sub changeGUIThreadSafe()
Me.Invoke(Sub() Button2.Enabled = False)
End Sub