none
Operação entre threads inválida RRS feed

  • Pergunta

  • Boa tarde caros colegas, estou tentando desenvolver um chat para a rede interna aqui e segui a "risca" esse tutorial.

    https://docs.microsoft.com/en-us/previous-versions/aa478452(v=msdn.10)#creating-the-chat-server

    Porém na hora em que o servidor recebe a mensagem ele me da o seguinte erro.

    Additional information: Operação entre threads inválida: controle 'lstStatus' acessado de um thread que não é aquele no qual foi criado.

    Private Sub UpdateStatus(ByVal t As String)
            lstStatus.Items.Add(t)
            lstStatus.SetSelected(lstStatus.Items.Count - 1, True)
        End Sub

    Pesquisei e vi que teria que usar um Invoke para poder manipular o evento de outro objeto mas pelo que eu entendi está correto. Será que alguem consegue me ajudar? Faz dias que to tentando fazer isso funcionar kkkkk.

    O Invoke to fazendo da seguinte maneira

    Private Sub DoListen()
            Try
    
                mobjListener = New TcpListener(IP, 5000)
                mobjListener.Start()
    
                Do
                    Dim x As New Client(mobjListener.AcceptTcpClient)
    
                    AddHandler x.Connected, AddressOf OnConnected
                    AddHandler x.Disconnected, AddressOf OnDisconnected
                    AddHandler x.LineReceived, AddressOf OnLineReceived
    
                    mcolClients.Add(x.ID, x)
    
                    Dim params() As Object = {"New Connection"}
                    
                    Me.Invoke(New StatusInvoker(AddressOf Me.UpdateStatus), params)
                    Return
                Loop Until False
            Catch
            End Try
        End Sub

    E no Load do form ta assim:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            mobjThread = New Threading.Thread(AddressOf DoListen)
            mobjThread.Start()
            UpdateStatus("Listener started")
    
        End Sub

    O que está errado? tenho declarado a nivel de classe

    Public Delegate Sub StatusInvoker(ByVal t As String)
    
        Private mcolClients As New Hashtable()
        Private mobjListener As TcpListener
    
        Dim IP As IPAddress = IPAddress.Parse("127.0.0.1")
        Dim mobjThread As Thread

    Agradeço encarecidamente o apoio.

    quinta-feira, 5 de setembro de 2019 18:43