0

Windows フォームでコントロールを作成したスレッドとは別のスレッドでイベントがトリガーされる場所を読みました。

したがって、イベント ハンドラーはコントロールを直接更新することはできません (ボタンの色の変更など)。

Invoke または BeginInvoke が必要であるという説明を読みました。

私の質問: イベント ハンドラーに「this」を引数として渡すことができないのはなぜですか。

「これ」は、色を変更したいボタンを持つコントロールを持つフォームです!! ;)

デリゲートが「これ」を取ることができる例を見たことがあると断言できますが、そうではないかもしれません...

4

2 に答える 2

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
于 2010-01-28T01:23:43.217 に答える
1

別のスレッドのイベント ハンドラーが入ってボタンの内部状態をいじるのを止めるものは何もありません。

ただし、悪いことが起こります。例として、他の何かがコントロールに書き込もうとしているときに、そのコントロールのプロパティを変更するとどうなるでしょうか?

一度に 1 つのスレッドだけがオブジェクトの内部状態を操作する必要があります。別のスレッドからそのオブジェクトのメソッドを直接呼び出すと、他のスレッドが同じことをしていないことを保証できません。

Invoke は、直接呼び出さないことでこれを回避します。代わりに、オブジェクトを「所有」しているスレッドに「ちょっと時間があるときに、そのオブジェクトでこのメソッドを呼び出してもらえますか?」と伝えます。オブジェクトが一貫した状態にあるときに呼び出されます。

于 2010-01-28T01:05:02.543 に答える