1

我有一个这样的线程:

        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 将 Thread 发送到睡眠模式。这是否会以某种方式影响 TCPListener 在他的工作中以及当线程处于睡眠模式时传入连接会发生什么?

4

3 回答 3

0

当您的线程处于睡眠状态时,它无法执行任何操作。特别是它将无法接受连接。因此,连接到您的客户端将不得不等待 100 毫秒,直到连接建立(当您调用 Accept 和 Accept 返回时连接建立)。

于 2012-05-05T16:08:43.587 回答
0

侦听 TCP 连接并为其提供服务是一种标准设计模式。有一种比代码中更好的方法。在有连接请求之前使用TcpListener.AcceptTcpClient()which 块,当发生连接请求时,它会返回TcpClient,您可以使用它来为客户端提供服务。即使AcceptTcpClinet()是阻塞调用(在有请求之前不会返回),它也不会使用 CPU 时间。由于这正是您在代码中所做的(在有请求之前什么都不做),它将完成您想要的工作。

通常你应该避免Thread.Sleep(),因为它不是放弃 CPU 时间的最好方法。您应该使用专门的侦听方法AcceptTcpClinet(),例如计时器、异步调用WaitHandleThread.Join()。做起来要困难得多,有时也不值得,但这应该是你的目标。

于 2012-05-06T09:11:23.373 回答
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
于 2012-05-05T16:24:38.113 回答