.net Thread.Sleep是否会停用TCPListener?

.net Thread.Sleep是否会停用TCPListener?,.net,vb.net,multithreading,tcp,tcplistener,.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 The

我有一根这样的线:

        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的工作?线程处于睡眠模式时,输入连接会发生什么情况?

当线程处于睡眠状态时,它不能做任何事情。特别是它将无法接受连接。因此,连接到您的客户端必须等待100毫秒,直到连接建立(当您调用Accept和Accept returns时连接建立)

这是处理输入连接的有效方法:-),您不必让任何东西进入睡眠状态。如果性能是一个问题,则降低线程的优先级。例:

serverthread.Priority = ThreadPriority.BelowNormal

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


通常,您应该避免使用
Thread.Sleep()
,因为这不是放弃CPU时间的最佳方式。您应该使用专门的侦听方法,如
AcceptCpcLinet()
、计时器、异步调用、
WaitHandle
Thread.Join()等。要做到这一点要困难得多,有时也不值得,但这应该是你的目标。

是的。代码很奇怪,只有当有人试图连接时,你才会做一些事情。所以不用麻烦,只要调用AcceptSocket就可以了,这样你就不必睡觉来避免烧坏内核了。问题是,当我在没有线程的情况下运行它时,睡眠程序占用了我cpu的33%(amd x6 phenom),而thread.sleep只占17%。所以,当线程休眠时,连接仍然可以挂起,但不能被接受,我做对了吗?很不清楚如何使用thread.Sleep(100)调用烧掉17%的内核。无论如何,你应该更喜欢从AcceptSocket获得的0%。
serverthread.Priority = ThreadPriority.BelowNormal