0

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
4

1 に答える 1

3

変数のイベント(使用しない変数)CounterClass_GivingUpdate()のみを処理します。new を宣言するたびに、発生するイベントの独自のインスタンスがあります。_counterCounterClass

次の 2 つのオプションがあります。

  • オプション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
    
于 2016-07-16T11:32:41.550 に答える