void TransparentStreamReadRequestMessageReceived(TransparentStreamMessageBase transparentStreamMessageBase) { TransparentStreamReadRequestMessage request = (TransparentStreamReadRequestMessage)transparentStreamMessageBase; byte[] buffer = new byte[request.Count]; try { baseStream.BeginRead(buffer, 0, request.Count, (ar) => { try { int bytesRead = baseStream.EndRead(ar); if (bytesRead != ((byte[])ar.AsyncState).Length) { byte[] newBuffer = new byte[bytesRead]; System.Buffer.BlockCopy((byte[])ar.AsyncState, 0, newBuffer, 0, bytesRead); objectBusSession.SendMessage(new TransparentStreamReadResponseMessage(streamID, request.ID, newBuffer, null)); } else { objectBusSession.SendMessage(new TransparentStreamReadResponseMessage(streamID, request.ID, (byte[])ar.AsyncState, null)); } } catch (Exception ex) { objectBusSession.SendMessage(new TransparentStreamReadResponseMessage(streamID, request.ID, (byte[])ar.AsyncState, ex)); } }, buffer); } catch (Exception ex) { objectBusSession.SendMessage(new TransparentStreamReadResponseMessage(streamID, request.ID, null, ex)); } }
public override IAsyncResult BeginRead (byte[] buffer, int offset, int count, AsyncCallback callback, object state) { TransparentStreamReadRequestMessage request = new TransparentStreamReadRequestMessage (Guid.NewGuid (), streamID, count); TransparentStreamAsyncResult result = new TransparentStreamAsyncResult (callback, state); if (!pendingReadRequests.TryAdd (request.ID, new Tuple <TransparentStreamAsyncResult, byte[], int, int> (result, buffer, offset, count))) { throw new Exception ("request failed before sending."); } objectBusSession.SendMessage (request); return result; }