Создание события в новой теме в VB.NET - PullRequest
4 голосов
/ 13 февраля 2012

Мне нужно вызвать событие из формы в новом потоке.

(Я не думаю, что причина этого уместна, но на всякий случай: я буду вызывать события из кода внутри подпрограммы WndProc формы. Если код, обрабатывающий событие, блокирует что-то в форме [например, msgbox], тогда возникают всевозможные проблемы с отключенным контекстом, а что нет. Я подтвердил, что повышение событий в новых потоках устраняет проблему.)

Вот что я сейчас делаю:

Public Event MyEvent()

Public Sub RaiseMyEvent()
    RaiseEvent MyEvent
End Sub

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Dim t As New Threading.Thread(AddressOf RaiseMyEvent)
    t.Start()
End Sub

Есть ли лучший способ?

Насколько я понимаю, события в VB на самом деле состоят из делегатов на заднем плане. Есть ли способ вызывать события в новых потоках без создания подпрограмм для каждого? Или есть более подходящий метод, который я должен использовать?

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012

Вы можете исключить подпрограмму RaiseMyEvent следующим образом:

Public Class Class1

    Public Event MyEvent()

    Sub Demo()
        Dim t As New Threading.Thread(Sub() RaiseEvent MyEvent())
        t.Start()
    End Sub

End Class
4 голосов
/ 13 февраля 2012

Не знаю, поможет ли это, но я всегда буду заниматься многопоточностью и такими событиями:

Event MyEvent(ByVal Var1 As String, ByVal Var2 As String)

Private Delegate Sub del_MyEvent(ByVal Var1 As String, ByVal Var2 As String)

Private Sub StartNewThread()
    'MAIN UI THREAD

    Dim sVar1 As String = "Test"
    Dim sVar2 As String = "Second Var"

    Dim oThread As New Threading.Thread(New Threading.ParameterizedThreadStart(AddressOf StartNewThread_Threaded))
    With oThread
        .IsBackground = True
        .Priority = Threading.ThreadPriority.BelowNormal
        .Name = "StartNewThread_Threaded"

        .Start(New Object() {sVar1, sVar2})
    End With
End Sub
Private Sub StartNewThread_Threaded(ByVal o As Object)
    'CHILD THREAD
    Dim sVar1 As String = o(0)
    Dim sVar2 As String = o(1)

    'Do threaded operation
    Threading.Thread.Sleep(1000)

    'Raise event
    RaiseEvent_MyEvent(sVar1, sVar2)

End Sub

Public Sub RaiseEvent_MyEvent(ByVal Var1 As String, ByVal Var2 As String)

    If Me.InvokeRequired Then
        'Makes the sub threadsafe (I.e. the event will only be raised in the UI Thread)
        Dim oDel As New del_MyEvent(AddressOf RaiseEvent_MyEvent)
        Me.Invoke(oDel, Var1, Var2)
        Exit Sub
    End If

    'MAIN UI THREAD
    RaiseEvent MyEvent(Var1, Var2)
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...