我有这样一个帖子:
Public Sub StartWork()
Try
myTCPListener.Start()
While StopRequest = False
Dim requestspending As Boolean = m_TCPListener.Pending()
If myTCPListener.Pending = False Then
Threading.Thread.Sleep(100)
Else
DoSomething()
End If
End While
Catch ex As Exception
Throw ex
End Try
End Sub
现在我的问题是:当这里没有任何反应时,我通过Thread.Sleep将线程发送到睡眠模式。这会以某种方式影响他的工作中的TCPListener,以及当线程处于睡眠模式时,会发生什么连接吗?
答案 0 :(得分:0)
当你的线程处于睡眠状态时,它无法做任何事情。特别是它将无法接受连接。因此,连接到您的客户端必须等待100毫秒,直到建立连接(当您调用Accept和Accept返回时建立连接)。
答案 1 :(得分:0)
Dim connection As Socket
Dim reader As BinaryReader
Dim writer As BinaryWriter
Dim socketStream As NetworkStream
Dim listener As TcpListener
Dim ip As IPAddress = IPAddress.Parse(ipstring)
listener = New TcpListener(ip, portnumber)
listener.Start()
connection = listener.AcceptSocket()
socketStream = New NetworkStream(connection)
writer = New BinaryWriter(socketStream)
reader = New BinaryReader(socketStream)
这是处理传入连接的有效方法:-),你不必放任何东西睡觉。如果性能是一个问题,请降低线程的优先级。例如:
serverthread.Priority = ThreadPriority.BelowNormal
答案 2 :(得分:0)
侦听TCP连接并提供服务是标准设计模式。有一种比你的代码更好的方法。使用TcpListener.AcceptTcpClient()
阻止,直到有连接请求,当发生这种情况时,它会返回TcpClient
,您可以使用它来为客户端提供服务。即使AcceptTcpClinet()
是阻塞调用(在有请求之前也不会返回),它将不会使用CPU时间。因为这正是你在代码中所做的事情(在有请求之前什么都不做),它将完成你想要的工作。
通常你应该避免使用Thread.Sleep()
,因为它不是放弃CPU时间的最佳方法。您应该使用专门的监听方法,如AcceptTcpClinet()
,定时器,异步调用,WaitHandle
,Thread.Join()
等。这样做更难,有时也不值得,但这应该是你的目标。