Vb.net Visual Basic窗体在收到tcp/ip响应后冻结
我在Linux主机上的Python和windows主机上的Visual basic之间有一个基本的TCP/IP通信设置。windows主机似乎工作正常,作为测试,我向Linux机器发送了一个0,并让它在Visual Basic调试控制台中打印一个0作为响应。一切正常,但在VisualBasic接收到响应并成功显示后,它会冻结表单,因此我无法按其他按钮。下面是一个代码示例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
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你的评论,而不是你最初的帖子,但我会认为你是正确的