【发布时间】:2019-05-10 06:11:03
【问题描述】:
下面提到的两条线都有效。它用于启用或禁用表单内的按钮。但问题是我们为什么要使用 form.Invoke 方法而不是直接分配方法。
方法一:
frmPrint.Invoke(Sub() frmPrint.btnCancel.Enabled = False)
方法二:
frmPrint.btnCancel.Enabled = False
谢谢, 萨拉提
【问题讨论】:
-
你
[Control].Invoke(delegate)当属性/方法从 UI 线程以外的线程设置/调用时。您应该使用.BeginInvoke()而不是Invoke()。 -
一般来说,我不能告诉你为什么你应该使用 Invoke(...) 而不是直接给控件属性赋值。但我可以告诉你,什么时候有意义这样做:正如 Jimi 已经提到的,所有 UI 元素都是由 UI 线程专门驱动的,如果到目前为止我可以这么称呼它的话。如果您现在想从另一个线程调用 frm.btnCancel.Enabled = False,这将失败,除非您使用 Invoke(...) 执行此操作。因此,如果您的代码(可能)未在 UI 线程中运行,您应该使用这种方式。甚至还有其他技术可以确保代码由 UI 线程执行。
-
感谢@jimi 和 user1470240,现在我对这种方法有了一些想法。