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));
            }
        }
Exemplo n.º 2
0
		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;
		}