【发布时间】:2017-07-07 17:55:20
【问题描述】:
我不确定为什么从 UI 线程调用这段代码时有效,但不是:
Delegate Sub CtrlPropertyChangeDelegate(ByRef ControlProperty As Object, ByVal NewValue As Object)
Sub CtrlPropertyChange(ByRef ControlProperty As Object, ByVal NewValue As Object)
If Me.InvokeRequired Then
Me.Invoke(New CtrlPropertyChangeDelegate(AddressOf CtrlPropertyChange), ControlProperty, NewValue)
Else
ControlProperty = NewValue
End If
End Sub
它应该获取控件的属性(例如 Form1.Text)并更改其值。任何帮助将不胜感激
【问题讨论】:
-
当你不需要调用你直接修改
ControlProperty引用。但是,当您调用Invoke()时,参数将作为对象数组传递,其中每个数组项都按值传递。这是数组的标准行为,无法更改。 -- 使用@MrGadget的解决方案,直接调用方法,仍然通过引用传递ControlProperty。 -
不幸的是,似乎不能在 lambda 表达式中使用 ByRef 参数@VisualVincent
-
但是 lambda 表达式的行为应该像任何普通方法一样,调用另一个具有
ByRef参数的方法应该无关紧要。我会尝试一下,如果我不能让它发挥作用,我有一个可供您使用的替代解决方案。 -
我很快就会发布我的解决方案。目前正在努力。
-
旁白:我不了解你们,但我发现这是 dot.net 最烦人的“功能”之一。是的,我知道,线程安全......等等。但我不喜欢像这样产生错误而不是警告的约束。恕我直言.. 是的,我知道这不是线程安全的......但在这种情况下......我不在乎......应该是一个选择。
标签: .net vb.net multithreading user-interface delegates