Visual Basic 窗体在收到 tcp/ip 响应后冻结



我在Linux主机上的Python和Windows主机上的Visual Basic之间有一个基本的TCP/IP通信设置。Windows主机似乎工作正常,作为测试,我向Linux机器发送一个0,并让它响应打印到Visual Basic调试控制台中的0。一切正常,但在 Visual Basic 收到响应并成功显示后,它会冻结表单,因此我无法按另一个按钮。下面是代码的示例。

Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Public Class Form1
    Shared Sub Main()
        Dim tcpClient As New System.Net.Sockets.TcpClient()
        tcpClient.Connect("192.168.60.124", 9999)
        Dim networkStream As NetworkStream = tcpClient.GetStream()
        If networkStream.CanWrite And networkStream.CanRead Then
            ' Do a simple write.
            Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("0")
            networkStream.Write(sendBytes, 0, sendBytes.Length)
            ' Read the NetworkStream into a byte buffer.
            Dim bytes(tcpClient.ReceiveBufferSize) As Byte
            networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
            ' Output the data received from the host to the console.
            Dim returndata As String = Encoding.ASCII.GetString(bytes)
            Console.WriteLine(("Host returned: " + returndata))
            tcpClient.Close()
        Else
            If Not networkStream.CanRead Then
                Console.WriteLine("cannot not write data to this stream")
                tcpClient.Close()
            Else
                If Not networkStream.CanWrite Then
                    Console.WriteLine("cannot read data from this stream")
                    tcpClient.Close()
                End If
            End If
        End If
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Main()
    End Sub
End Class   

自从 OP 请求以来,我将我的评论作为我的回答帖子的一部分^^

请参阅多线程和控制台.WriteLine,

"许多人使用Console.WriteLine作为多线程程序中的日志记录。但实际上,这会让事情变慢。控制台 I/O 流是同步的,即它正在阻塞 I/O 操作。每当多个线程使用 Console.WriteLine 时,只有一个线程可以执行 I/O 操作,其他线程需要等待

我想知道这就是为什么Console.WriteLine阻止UI的原因?


原始帖子

我想知道你需要用Visual Basic .NET进行多线程编程。因为主线程(UI 线程)中有 TCP 客户端活动。因此,除非完成 TCP 客户端活动,否则您无法在 UI 上执行任何操作,例如按钮单击。

我的建议是将您的 TCP 客户端活动放入一个函数中,并在单击 button1 后启动另一个线程以继续它。

Sub Tcpclient()
    ' The statement of TCPClient function
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim tcpClientThread As New System.Threading.Thread( _
        AddressOf Tcpclient)
    tcpClientThread.Start()
End Sub

最新更新