从工作线程中提升事件Vb.net

时间:2016-07-16 00:57:07

标签: vb.net multithreading raiseevent

我正在查看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 个答案:

答案 0 :(得分:3)

您的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