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

Vb.net Visual Basic窗体在收到tcp/ip响应后冻结,vb.net,forms,button,tcpclient,visual-studio-2015,Vb.net,Forms,Button,Tcpclient,Visual Studio 2015,我在Linux主机上的Python和windows主机上的Visual basic之间有一个基本的TCP/IP通信设置。windows主机似乎工作正常,作为测试,我向Linux机器发送了一个0,并让它在Visual Basic调试控制台中打印一个0作为响应。一切正常,但在VisualBasic接收到响应并成功显示后,它会冻结表单,因此我无法按其他按钮。下面是一个代码示例 Imports System.Net Imports System.Net.Sockets Imports System.Te

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

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的要求,我把我的评论作为我回复帖子的一部分^^

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

我想知道这就是为什么Console.WriteLine会阻止UI


原职 我想知道您是否需要这样做。因为您的主线程(UI线程)中有TCP客户端活动。因此,除非TCP客户端活动完成,否则您无法在UI上执行任何操作,例如按钮单击

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

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

自从我发布了这篇文章,我实际上把它放在了一个单独的线程中,问题是线程没有关闭。我把它缩小到了Console.WriteLine,当我删除它时,它工作得很好。但是我真的很喜欢控制台用于调试目的。你是对的,我有多个线程在做Console write。谢谢。我希望我能选中mark你的评论,而不是你最初的帖子,但我会认为你是正确的