Вот сценарий: для сервер-клиентских приложений клиенты всегда должны быть в цикле прослушивания сообщений, передаваемых с сервера.Для этого я использую TcpClient.GetStream().BeginRead()
асинхронный метод с обратным вызовом:
Private Sub OnDataArrival(ByVal ar As IAsyncResult)
Dim count As Integer
Try
count = Me.mTCPSocket.GetStream().EndRead(ar)
If count < 1 Then _
Throw New System.Net.Sockets.SocketException()
' ...
Me.mTCPSocket.GetStream().BeginRead(dataBuffer, 0, dataBuffer.Length, _
AddressOf OnDataArrival, Nothing)
Catch ex As Exception
OnDisconnect()
End Try
End Sub
Однако клиентам иногда необходимо также общаться с сервером, то есть отправлять сообщение и получать ответ (во время широковещательных сообщений).отправляются каждому другому клиенту, конкретные ответы отправляются только запрашивающему клиенту).
В настоящее время в моей реализации клиент инициирует диалог через блокирующий вызов, например,
With (New IO.StreamWriter(Me.mTCPSocket.GetStream()))
.Write(message & ControlChars.Cr)
.Flush()
End With
, и этоХорошо, что поток будет блокироваться, пока не будет получен ответ от сервера.
Тем не менее, вот где я застрял.Теоретически мне понадобится блокирующее чтение, но это будет мешать асинхронному чтению.Итак, что будет лучшим способом для достижения желаемого поведения?