我已经阅读了在 Windows 窗体上创建控件的另一个线程上触发事件的位置。
因此,事件处理程序不能直接更新控件(例如更改按钮的颜色)。
我阅读了有关需要 Invoke 或 BeginInvoke 的说明。
我的问题:为什么不能将事件处理程序仅作为 agrument 传递“this”。
'this' 是其控件具有希望更改颜色的按钮的表单!;)
我可以发誓我见过代表可以接受“这个”的例子——但也许不是……
没有什么可以阻止另一个线程上的事件处理程序只是进入并拧紧按钮的内部状态。
但是,它会导致不好的事情发生——例如,如果您更改了控件的属性而其他东西也试图写入它会发生什么?
一次只能有一个线程处理对象的内部状态 - 如果您直接从另一个线程调用该对象的方法,则不能保证其他东西不会做同样的事情。
Invoke 通过不直接调用它来解决这个问题 - 相反,它对'拥有'对象的线程说“嘿,你有时间可以在那个对象上调用这个方法吗?”,从而确保该方法只是当对象处于一致状态时调用。
如果您在表单中使用实例方法处理事件,则您已经有了一个“this”参数。说这样的话:
Public Class MyForm
Inherits Form
Private port As New SerialPort()
Private Sub RegisterHandlers()
AddHandler port.DataReceived, AddressOf ProcessData
End Sub
Private Sub ProcessData(ByVal sender As Object, ByVal e As EventArgs)
If Me.InvokeRequired Then
'marshal to required thread
Exit Sub
End If
'do stuff on the form thread
End Sub
End Class