Поднять событие Vb.net из рабочего потока

Я смотрю на консольное приложение для vb.net. Я пытаюсь заставить рабочий поток поднять событие в основной поток для отображения данных на экране (слово "HIT" каждый раз, когда рабочий поток завершает цикл). Мой код ниже.

Я не уверен, почему, но основной поток Private Sub CounterClass_GivingUpdate() Handles _counter.AboutToDistributeNewupdate не выполняется.

Imports System.Threading

Module Module1

    Private WithEvents _counter As CounterClass
    Private trd As Thread
    Sub Main()
        While True

            Dim s As String = Console.ReadLine()
            Dim started As Boolean
            Select Case s
                Case "status"
                    WriteStatusToConsole("You typed status")
                Case "startcounter"
                    If started = False Then
                        starttheThread()
                        started = True
                        WriteStatusToConsole("You Have Started The Timer")
                    Else
                        WriteStatusToConsole("YOU HAVE ALREADY STARTED THE TIMER!!!")
                    End If

            End Select
        End While

    End Sub


    Private Sub CounterClass_GivingUpdate() Handles _counter.AboutToDistributeNewupdate
        WriteStatusToConsole("Hit")
    End Sub

    Private Sub starttheThread()
        Dim c As New CounterClass
        trd = New Thread(AddressOf c.startProcess)
        trd.Start()
    End Sub
    Sub WriteStatusToConsole(ByVal stringToDisplay As String)
        Console.WriteLine(stringToDisplay)
    End Sub
End Module

Public Class CounterClass
    Public Event AboutToDistributeNewupdate()
    Public Sub sendStatusUpdateEvent(ByVal updatestatus As String)
        RaiseEvent AboutToDistributeNewupdate()
    End Sub

    Public Sub startProcess()
        Dim i As Int64
        Do
            Thread.Sleep(1000)
            i = i + 1
            sendStatusUpdateEvent(i.ToString)
        Loop
    End Sub

End Class

1 ответ

Решение

Ваш CounterClass_GivingUpdate() только обрабатывает _counter событие переменной (переменная, которую вы не используете!). Каждый раз, когда вы объявляете новый CounterClass у него есть свой экземпляр события, которое он вызывает.

Вы знаете, есть два варианта:

  • Опция 1

    Подписаться на событие для каждого нового CounterClass экземпляр вы создаете. Это означает, что вы должны использовать AddHandler оператор каждый раз, когда вы создаете новый экземпляр вашего класса:

    Private Sub starttheThread()
        Dim c As New CounterClass
        AddHandler c.AboutToDistributeNewupdate, AddressOf CounterClass_GivingUpdate
        trd = New Thread(AddressOf c.startProcess)
        trd.Start()
    End Sub
    
  • Вариант 2

    Отметить событие как Shared сделать его доступным без необходимости создания экземпляра класса. Для этого вы также должны изменить способ подписки на событие, подписавшись на него в своем методе. Main():

    Sub Main()
        AddHandler CounterClass.AboutToDistributeNewupdate, AddressOf CounterClass_GivingUpdate
    
        ...the rest of your code...
    End Sub
    
    Private Sub CounterClass_GivingUpdate() 'No "Handles"-statement here.
        WriteStatusToConsole("Hit")
    End Sub        
    
    Public Class CounterClass
        Public Shared Event AboutToDistributeNewupdate() 'Added the "Shared" keyword.
    
        ...the rest of your code...
    End Class
    
Другие вопросы по тегам