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()
и так далее. Это гораздо труднее сделать, а иногда и не стоит, но это должно быть вашей целью.