VB.NET RaiseEvent, потокобезопасный? - PullRequest
1 голос
/ 08 января 2010

Является ли RaiseEvent потокобезопасным?

В C # вы пишете

if (event != null)
{
    event.invoke();
}

и код C # не является потокобезопасным ....

Ответы [ 2 ]

2 голосов
/ 08 января 2010

Если мне нужно сделать потокобезопасные события, я напишу это:

Class Test

    Public Event Click(ByVal sender As Object, ByVal e As EventArgs)
    Public Event MouseIn(ByVal sender As Object, ByVal e As EventArgs)

    Private Delegate Sub EventArgsDelegate(ByVal e As EventArgs)
    Private ReadOnly _parent As Control

    Public Sub New(ByVal parent As Control)
        _parent = parent
    End Sub

    Private Sub OnClick(ByVal e As EventArgs)

        If _parent.InvokeRequired Then
            _parent.Invoke(New EventArgsDelegate(AddressOf OnClick), e)
        Else
            RaiseEvent Click(Me, e)
        End If

    End Sub

    Private Sub OnMouseIn(ByVal e As EventArgs)

        If _parent.InvokeRequired Then
            _parent.Invoke(New EventArgsDelegate(AddressOf OnMouseIn), e)
        Else
            RaiseEvent MouseIn(Me, e)
        End If

    End Sub

End Class

Затем, когда мне нужно вызвать событие, я просто использую OnClick(new eventargs(...)) и т. Д. Если вы используете Отражатель , вы можете заметить, что большинство потоковобезопасных элементов управления используют похожую систему.

2 голосов
/ 08 января 2010

В C # вы скорее пишете:

EventHandler h= myEvent;
if (h!=null)
   h(...);

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

Вызов события подразумевает, что слушатель готов обработать это событие. Это сильно зависит от вашей конкретной ситуации и обычно достигается за счет использования механизмов синхронизации.

Что именно вы подразумеваете под "Безопасный поток"?

...