-2

Ich bin ein Anfänger in VB.NET, bitte ertragen mit mir.VB.NET [Cross-Thread-Betrieb nicht gültig: Control 'txtIncomingText' von einem Thread zugegriffen ........]

Ich habe eine Multiclient TCP-IP-Socket-Server-Client-Anwendung in VB.NET heruntergeladen. Der Server hört gut zu, aber der Client stößt unterhalb der Ausnahme:

"Cross-Thread-Operation nicht gültig: Control 'txtIncomingText' zugegriffen von einem anderen Thread als der Thread, auf dem es erstellt wurde."

Ich werde groß sein, wenn Sie mir mit korrigierter Version des Codes helfen könnten. Vielen Dank.

'------- CLIENT CODE -------

Imports System.Windows.Forms 
Imports System.Collections.Generic 
Imports System.ComponentModel 
Imports System.Data 
Imports System.Drawing 
Imports System.Linq 
Imports System.Net 
Imports System.Net.Sockets 
Imports System.Text 
Imports System.Threading 

Public Class frmClient 

    Inherits Form 

    Private Sub frmClient_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 

    End Sub 

    Private _clientSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) 

    Public Sub New() 
     InitializeComponent() 
    End Sub 

    Private receivedBuf As Byte() = New Byte(1023) {} 
    Private thr As Thread 

    Private Sub ReceiveData(ar As IAsyncResult) 
     Dim socket As Socket = DirectCast(ar.AsyncState, Socket) 
     Dim received As Integer = socket.EndReceive(ar) 
     Dim dataBuf As Byte() = New Byte(received - 1) {} 
     Array.Copy(receivedBuf, dataBuf, received) 


     ' These two lines encounter an error ->>>>> 
     txtIncomingText.Text = (Encoding.ASCII.GetString(dataBuf)) 
     rbChat.Text = "\nServer: " + txtIncomingText.Text 


     _clientSocket.BeginReceive(receivedBuf, 0, receivedBuf.Length, SocketFlags.None, New AsyncCallback(AddressOf ReceiveData), _clientSocket) 
    End Sub 

    Private Sub SendLoop() 
     While True 
      'Console.WriteLine("Enter a request: "); 
      'string req = Console.ReadLine(); 
      'byte[] buffer = Encoding.ASCII.GetBytes(req); 
      '_clientSocket.Send(buffer); 

      Dim receivedBuf As Byte() = New Byte(1023) {} 
      Dim rev As Integer = _clientSocket.Receive(receivedBuf) 
      If rev <> 0 Then 
       Dim data As Byte() = New Byte(rev - 1) {} 
       Array.Copy(receivedBuf, data, rev) 
       lbStt.Text = ("Received: " + Encoding.ASCII.GetString(data)) 
       rbChat.AppendText(vbLf & "Server: " + Encoding.ASCII.GetString(data)) 
      Else 
       _clientSocket.Close() 
      End If 
     End While 
    End Sub 

    Private Sub LoopConnect() 
     Dim attempts As Integer = 0 
     While Not _clientSocket.Connected 
      Try 
       attempts += 1 
       _clientSocket.Connect(IPAddress.Loopback, 420) 
      Catch generatedExceptionName As SocketException 
       'Console.Clear(); 
       lbStt.Text = ("Connection attempts: " + attempts.ToString()) 
      End Try 
     End While 
     lbStt.Text = ("Connected!") 
    End Sub 

    Private Sub btnSend_Click(sender As System.Object, e As System.EventArgs) Handles btnSend.Click 
     If _clientSocket.Connected Then 

      Dim buffer As Byte() = Encoding.ASCII.GetBytes(txtText.Text) 
      _clientSocket.Send(buffer) 
      rbChat.AppendText("Client: " + txtText.Text) 
     End If 
    End Sub 

    Private Sub btnConnect_Click(sender As System.Object, e As System.EventArgs) Handles btnConnect.Click 
     LoopConnect() 
     ' SendLoop(); 
     _clientSocket.BeginReceive(receivedBuf, 0, receivedBuf.Length, SocketFlags.None, New AsyncCallback(AddressOf ReceiveData), _clientSocket)   Dim buffer As Byte() = Encoding.ASCII.GetBytes("@@" + txtName.Text) 
     _clientSocket.Send(buffer) 
    End Sub 

End Class 
+0

Welcher Teil der Fehlermeldung verwirrt Sie? Es ist sehr klar - Sie können nicht auf Steuerelemente von einem Nicht-UI-Thread zugreifen. – Plutonix

+0

Mögliches Duplikat von [Cross-Thread-Operation nicht gültig: Steuerelement, auf das von einem anderen Thread als dem Thread zugegriffen wurde, auf dem es erstellt wurde] (https://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control -accessed-from-a-thread-other-than-the) –

+0

Es muss ein vb.net-Duplikat sein. – djv

Antwort

1

Nun, sollten Sie die Anrufe auf das Gewinde des Steuer aufzurufen. Dies ist eine schnelle und schmutzige Lösung.

Dim message = Encoding.ASCII.GetString(dataBuf) 
txtIncomingText.Invoke(Sub() txtIncomingText.Text = message) 
rbChat.Invoke(Sub() rbChat.Text = Environment.NewLine & "Server: " & message) 

Sie sollten jedoch zuerst prüfen, ob der Aufruf erforderlich ist. Siehe https://msdn.microsoft.com/en-us/library/ms171728(v=vs.110).aspx

Auch "\n" nicht ist, wie Sie eine neue Zeile in vb.net machen (Sie diesen Code von C# kopiert haben?).

Und + ist nicht, wie Sie Zeichenfolgen in vb.net verketten (siehe oben Klammer).

+0

Wow, vielen Dank !! Es funktionierte!! Wie stimme ich deine Antwort auf? –

+0

Sie haben richtig gedacht, ich habe heruntergeladen, konvertiert diesen Code von C# zu VB.NET mit einigen Conversion-Websites :) –

Verwandte Themen