Thread.Sleep是否停用TCPListener?

时间:2012-05-05 15:58:00

标签: .net vb.net multithreading tcp tcplistener

我有这样一个帖子:

        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,以及当线程处于睡眠模式时,会发生什么连接吗?

3 个答案:

答案 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(),定时器,异步调用,WaitHandleThread.Join()等。这样做更难,有时也不值得,但这应该是你的目标。