.NET TcpClient асинхронное и синхронное чтение для одного и того же клиента - PullRequest
0 голосов
/ 29 октября 2011

Вот сценарий: для сервер-клиентских приложений клиенты всегда должны быть в цикле прослушивания сообщений, передаваемых с сервера.Для этого я использую 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

, и этоХорошо, что поток будет блокироваться, пока не будет получен ответ от сервера.

Тем не менее, вот где я застрял.Теоретически мне понадобится блокирующее чтение, но это будет мешать асинхронному чтению.Итак, что будет лучшим способом для достижения желаемого поведения?

...