事件处理程序可以将当前对象作为参数吗?

时间:2010-01-28 00:54:37

标签: forms events invoke

我已经阅读了在Windows窗体上创建控件的另一个线程上触发事件的位置。

因此,事件处理程序无法直接更新控件(例如更改按钮的颜色)。

我阅读了有关需要Invoke或BeginInvoke的解释。

我的问题:为什么事件处理程序不能作为一个agrument传递给'this'。

'this'是一种形式,其控件具有希望颜色变化的按钮! ;)

我可以发誓我已经看过代表可以采取'这个'的情况 - 但也许不是......

2 个答案:

答案 0 :(得分:1)

没有什么能阻止另一个线程上的事件处理程序进入并调整按钮的内部状态。

然而,它会导致不好的事情发生 - 例如,如果你改变了控件的属性而其他东西也试图写入它会发生什么?

一次只有一个线程应该与一个对象的内部状态一起旋转 - 如果你从另一个线程直接调用该对象的方法,你不能保证其他东西没有做同样的事情。

Invoke通过不直接调用它来解决这个问题 - 而是向线程说'拥有'对象“嘿,当你有片刻时,你可以在该对象上调用此方法吗?”,从而确保方法仅在对象处于一致状态时调用。

答案 1 :(得分:1)

如果您正在使用表单中的实例方法处理事件,则您已经有一个“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