以下是场景:对于服务器 - 客户端应用程序,客户端应始终处于从服务器广播的消息的侦听循环中。为此,我使用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
并且可以阻止线程阻塞,直到从服务器收到响应为止。
然而,这就是我被困住的地方。从理论上讲,我需要在这里进行阻塞读取,但这会干扰正在进行的异步读取。那么实现理想行为的最佳方式是什么?