Vb.net Разница между назначением свойств напрямую и использованием метода invoke - PullRequest
0 голосов
/ 10 мая 2019

Обе строки, указанные ниже, работают.используется для включения или отключения кнопки внутри формы.но вопрос в том, почему мы должны использовать метод form.Invoke вместо прямого метода присвоения.

Метод 1:

frmPrint.Invoke(Sub() frmPrint.btnCancel.Enabled = False)

Метод 2:

frmPrint.btnCancel.Enabled = False

Спасибо, Саратхи

1 Ответ

2 голосов
/ 10 мая 2019

Метод 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...