下面提到的两行均有效。它用于启用或禁用表单内的按钮。但是问题是为什么我们应该使用form.Invoke方法而不是直接分配方法。
方法1:
frmPrint.Invoke(Sub() frmPrint.btnCancel.Enabled = False)
方法2:
frmPrint.btnCancel.Enabled = False
谢谢, 萨拉蒂
答案 0 :(得分:1)
Invoke()
方法在拥有基础窗口句柄的控件的线程上执行指定的委托。
简单来说,从不是GUI主线程的其他线程更新GUI时,应使用Invoke()
方法。
因此,如果要从主线程更新GUI,则不必使用Invoke()
方法。
安全的多线程GUI更新
从其他线程更新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