Vb.net直接分配属性和使用invoke方法之间的区别

时间:2019-05-10 06:11:04

标签: .net vb.net winforms

下面提到的两行均有效。它用于启用或禁用表单内的按钮。但是问题是为什么我们应该使用form.Invoke方法而不是直接分配方法。

方法1:

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

方法2:

frmPrint.btnCancel.Enabled = False

谢谢, 萨拉蒂

1 个答案:

答案 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