У меня есть следующий код как часть TCP сервераЧто происходит, когда выполняется GetStream.Read?
Private Sub StartTcpClient(ByVal client As TcpClient)
Dim bytesRead As Integer
Dim RxBuffer(1024) As Byte
Dim RxDataStr As String = ""
Dim BeginTime As Date = Date.Now
Dim CurrentTime As Date
Dim ElapsedTicks As Long = -1
'Dim elapsedSpan As New TimeSpan(elapsedTicks)
While True
bytesRead = client.GetStream.Read(RxBuffer, 0, RxBuffer.Length)'What happen here?
If bytesRead > 0 Or ElapsedTicks < 3 * 10000000.0 Then 'Espera hasta 3 segundos
CurrentTime = Date.Now
ElapsedTicks = CurrentTime.Ticks - BeginTime.Ticks
'RxDataStr = System.Text.ASCIIEncoding.ASCII.GetString(RxBuffer, 0, bytesRead) 'Original
RxDataStr += System.Text.ASCIIEncoding.Default.GetString(RxBuffer, 0, bytesRead) 'UTF8
Else
client.Close()
AckString = RxDataStr
AckReady = True
AckPending = False
Exit Sub
End If
End While
End Sub
Интересно, о том, что произойдет, когда линия GetStream.Read выполняется. Он уходит от моего кода и не возвращается, пока не будут собраны какие-либо данные или не произойдет ошибка или что-то еще?
Что мне нужно сделать, это закрыть текущее соединение, если время между приходом данных больше 3 секунд.
В общем, да, 'Stream.Read' - это блокировка чтения. Возможно, вы захотите посмотреть в async/wait, чтобы выполнить асинхронный ввод-вывод. – Alex
Я использую Thread, поэтому у меня нет проблем с графическим интерфейсом, но с этой частью кода Thread. Если я использую асинхронный/ожидающий асинхронный ввод-вывод, то цикл While в коде выше не перегружает процессор? Я думаю, чтобы изменить ReceiveTimeout на 3000. –
У вас [ReadAsync] (https://msdn.microsoft.com/en-us/library/hh137813 (v = vs.110) .aspx) и [BeginRead] (https://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.beginread(v=vs.110).aspx) –