首页 > 解决方案 > vb.net直接分配属性和使用invoke方法的区别

问题描述

下面提到的两条线都在工作。它用于启用或禁用表单内的按钮。但问题是我们为什么要使用 form.Invoke 方法而不是直接分配方法。

方法一:

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

方法二:

frmPrint.btnCancel.Enabled = False

谢谢,萨拉蒂

标签: .netvb.netwinforms

解决方案


Invoke()方法在拥有控件基础窗口句柄的线程上执行指定的委托。

简而言之,Invoke()当从不是 GUI 主线程的其他线程更新 GUI 时,应该使用该方法。

因此,如果您从主线程更新 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

推荐阅读