-2

我是VB.NET的初学者,请耐心等待。VB.NET [跨线程操作无效:控制'txtIncomingText'从线程访问........]

我已经在VB.NET中下载了多客户端TCP-IP套接字服务器客户端应用程序。服务器听得很好,但客户端遇到以下例外情况:

“跨线程操作无效:控制'txtIncomingText'从其创建线程以外的线程访问。

如果你们可以帮助我更正版本的代码,我将会很有帮助。谢谢。

“-------客户端代码-------

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

错误信息的哪些部分让您感到困惑?它非常清楚 - 您无法从非UI线程访问控件。 – Plutonix

+0

[Cross-thread operation not valid:可以从一个线程以外的线程访问它的线程](https://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control -accessor-from-a-thread-other-the) –

+0

必须有一个vb.net副本。 – djv

回答

1

那么,你应该调用控件的线程上调用。这是一个快速和肮脏的解决方案

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

但你应该检查是否需要首先调用。见https://msdn.microsoft.com/en-us/library/ms171728(v=vs.110).aspx

而且,"\n"是不是你做在vb.net一个新行(你从C#复制代码?)。

+是不是你如何连接在vb.net中的字符串(见括号)。

+0

哇,非常感谢!有效!!我如何提高您的答案? –

+0

你想好了,我下载了,使用一些转换网站将此代码从C#转换为VB.NET :) –

相关问题