Thread.Sleep деактивирует 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 ответа

Пока ваша нить спит, она ничего не может сделать. В частности, он не сможет принять соединение. Таким образом, клиенты, подключающиеся к вам, должны будут ждать 100 мс, пока соединение не будет установлено (соединение будет установлено, когда вы вызываете Accept и Accept возвращается).

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

Прослушивание TCP-соединений и их обслуживание - стандартная схема проектирования. Есть лучший способ сделать это, чем у вас в коде. использование TcpListener.AcceptTcpClient() который блокируется до тех пор, пока не появится запрос на соединение, и когда это произойдет, он вернется TcpClient Вы можете работать с клиентом. Даже если AcceptTcpClinet() является блокирующим вызовом (не возвращается, пока не поступит запрос), он не будет использовать процессорное время. Так как это именно то, что вы делаете в своем коде (ничего не делать, пока не поступит запрос), он будет выполнять ту работу, которую вы хотите.

Как правило, вы должны избегать Thread.Sleep() так как это не лучший способ отказаться от процессорного времени. Вы должны использовать специальные методы прослушивания, такие как AcceptTcpClinet(), таймеры, асинхронные вызовы, WaitHandle, Thread.Join() и так далее. Это гораздо труднее сделать, а иногда и не стоит, но это должно быть вашей целью.

Другие вопросы по тегам