.net - vb.net直接分配属性和使用invoke方法的区别
问题描述
下面提到的两条线都在工作。它用于启用或禁用表单内的按钮。但问题是我们为什么要使用 form.Invoke 方法而不是直接分配方法。
方法一:
frmPrint.Invoke(Sub() frmPrint.btnCancel.Enabled = False)
方法二:
frmPrint.btnCancel.Enabled = False
谢谢,萨拉蒂
解决方案
该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
推荐阅读
- discord.js - 发送消息而不是使用控制台来声明错误
- pseudocode - 下面的伪代码是什么意思?
- git - 没有什么可以比较的。main 和 master 是完全不同的提交历史
- php - 如何按照规定的顺序排序:小写、大写、数字和符号?
- javascript - JavaScript:使用 reduce() 和 map() 简化数组导致未定义
- r - 如何将子组总和作为标签添加到ggplot2中的直方图?
- python - 从字典列表中提取索引
- android - 更改 mlkit 条码扫描的读取位置
- shopify - 更改 Sublime 文本中的 Liquid 注释代码
- javascript - createPortal - JavaScript 运行良好时的 TypeScript document.getElementById 类型问题?