могут ли обработчики событий принимать текущий объект в качестве параметра? - PullRequest
0 голосов
/ 28 января 2010

Я прочитал, где событие инициируется в другом потоке из того, который создал элементы управления в форме Windows.

Поэтому обработчик событий не может напрямую обновлять элементы управления (например, изменение цвета кнопки).

Я прочитал объяснения о необходимости Invoke или BeginInvoke.

Мой вопрос: почему обработчик событий не может быть просто передан как «this» как агрегат.

'this' - это форма, чьи элементы управления имеют кнопки, которые хотят изменить свои цвета !! ;)

Могу поклясться, что видел случаи, когда делегат мог взять "это" - но, возможно, нет ...

Ответы [ 2 ]

1 голос
/ 28 января 2010

Если вы обрабатываете событие с помощью метода экземпляра в форме, у вас уже есть параметр "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
1 голос
/ 28 января 2010

Нет ничего, что могло бы остановить обработчик событий в другом потоке, просто войти и прокрутить внутреннее состояние кнопки.

Однако, это вызывает плохие вещи - например, что произойдет, если вы изменили свойство элемента управления, когда что-то еще пыталось записать в него?

Одновременно только один поток должен связываться с внутренним состоянием объекта - если вы вызываете методы непосредственно для этого объекта из другого потока, вы не можете гарантировать, что что-то еще не делает то же самое.

Invoke обходит это, не вызывая его напрямую - вместо этого он говорит потоку, который «владеет» объектом «Эй, не могли бы вы вызвать этот метод для этого объекта, когда у вас есть момент?», Таким образом гарантируя, что Метод вызывается только тогда, когда объект находится в согласованном состоянии.

...