0

だから私はメインフォームで、クライアントが接続されている場合は非表示にしたいので、別のクラス「Coms.class」から呼び出されるイベントを作成しましたクラスのすべてのコードは必要ないと思いますが、ただそれを言う必要があります。

これは、Coms クラスからのイベントをリッスンしている関数です。

メインフォーム:

Private Sub sAuthentified(ByVal sender As Coms, ByVal sTemp As String) Handles mComs.sAuthentified
    If (Equals(sender.AES_Decrypt(sTemp), "$%?SuccesS&*(")) Then
        Me.Hide()

        Dim connected As New Connected(mComs)
        connected.ShowDialog()
        connected.Dispose()
    Else
        Console.WriteLine("NON")
    End If
End Sub

クラス coms でイベントが発生する関数:

Private Sub Receiving(ByVal iAr As IAsyncResult)
        Dim bReader As BinaryReader
        Dim sReader As StreamReader
        Dim sReaderBuffer(iPacketSize) As Char
        Dim iReaded As Integer

        Try
            SyncLock _client.GetStream
                _client.GetStream.EndRead(iAr)
            End SyncLock
        Catch ex As Exception
            Exit Sub
        End Try

        Select Case bReadByte(0)
            Case enumTags.Connection
                SyncLock _client.GetStream
                    bReader = New BinaryReader(_client.GetStream)
                    iPacketSize = bReader.ReadInt16
                End SyncLock

                RaiseEvent connectionEstablished(Me)
                _client.GetStream.BeginRead(bReadByte, 0, 1, AddressOf Receiving, Nothing)

            Case enumTags.Authentication
                SyncLock _client.GetStream
                    sReader = New StreamReader(_client.GetStream)

                    iReaded = sReader.Read(sReaderBuffer, 0, iPacketSize)
                End SyncLock

                Dim sTemp As New String(sReaderBuffer, 0, iReaded)
                RaiseEvent sAuthentified(Me, sTemp)

                _client.GetStream.BeginRead(bReadByte, 0, 1, AddressOf Receiving, Nothing)
        End Select

    End Sub

そのため、イベントが発生すると、別のスレッドから呼び出されたため、デリゲートが必要であるというエラーが表示されます。Coms クラスでは、コールバックのストリームで非同期読み取りがあり、読み取りでイベントが発生するので、それは正常だと思います。

私の問題は次のとおりです。関数 hide で Invoke を呼び出すことができないため、デリゲートの作成方法について混乱しています

助けが必要です

4

1 に答える 1

1

独自のメソッドへのデリゲートを使用して BeginInvoke を呼び出すことができます。Hide() を呼び出すだけです。

それだけでは不十分です。ShowDialog() 呼び出しが UI スレッドから行われるようにする必要もあります。したがって、sAuthentified() メソッド全体が呼び出されていることを確認してください。

Private Sub sAuthentified(ByVal sender As Coms, ByVal sTemp As String) Handles mComs.sAuthentified
    If Me.InvokeRequired Then
        Me.BeginInvoke(New Action(Of Coms, String)(AddressOf sAuthentified), sender, sTemp)
    Else
        '' Rest of your code here
        ''...
    End If
End Sub
于 2013-11-10T15:41:10.187 に答える