Inheritance: LazyAsyncResult
Beispiel #1
0
        public void EndWriteMessage(IAsyncResult asyncResult)
        {
            if (asyncResult == null)
            {
                throw new ArgumentNullException(nameof(asyncResult));
            }

            WorkerAsyncResult workerResult = asyncResult as WorkerAsyncResult;

            if (workerResult != null)
            {
                if (!workerResult.InternalPeekCompleted)
                {
                    workerResult.InternalWaitForCompletion();
                }

                if (workerResult.Result is Exception)
                {
                    throw (Exception)(workerResult.Result);
                }
            }
            else
            {
                TaskToApm.End(asyncResult);
            }
        }
Beispiel #2
0
        private void ReadFrameCallback(IAsyncResult transportResult)
        {
            if (!(transportResult.AsyncState is WorkerAsyncResult))
            {
                NetEventSource.Fail(this, $"The state expected to be WorkerAsyncResult, received {transportResult}.");
            }

            if (transportResult.CompletedSynchronously)
            {
                return;
            }

            WorkerAsyncResult workerResult = (WorkerAsyncResult)transportResult.AsyncState;

            try
            {
                ReadFrameComplete(transportResult);
            }
            catch (Exception e)
            {
                if (e is OutOfMemoryException)
                {
                    throw;
                }

                if (!(e is IOException))
                {
                    e = new System.IO.IOException(SR.Format(SR.net_io_readfailure, e.Message), e);
                }

                workerResult.InvokeCallback(e);
            }
        }
Beispiel #3
0
        private void ReadFrameCallback(IAsyncResult transportResult)
        {
            if ((transportResult.AsyncState is WorkerAsyncResult) && GlobalLog.IsEnabled)
            {
                GlobalLog.Assert("StreamFramer::ReadFrameCallback|The state expected to be WorkerAsyncResult, received:{0}.", transportResult.GetType().FullName);
            }

            if (transportResult.CompletedSynchronously)
            {
                return;
            }

            WorkerAsyncResult workerResult = (WorkerAsyncResult)transportResult.AsyncState;

            try
            {
                ReadFrameComplete(transportResult);
            }
            catch (Exception e)
            {
                if (e is OutOfMemoryException)
                {
                    throw;
                }

                if (!(e is IOException))
                {
                    e = new System.IO.IOException(SR.Format(SR.net_io_readfailure, e.Message), e);
                }

                workerResult.InvokeCallback(e);
            }
        }
Beispiel #4
0
        private void ReadFrameCallback(IAsyncResult transportResult)
        {
            GlobalLog.Assert(transportResult.AsyncState is WorkerAsyncResult, "StreamFramer::ReadFrameCallback|The state expected to be WorkerAsyncResult, received:{0}.", transportResult.GetType().FullName);
            if (transportResult.CompletedSynchronously)
            {
                return;
            }

            WorkerAsyncResult workerResult = (WorkerAsyncResult)transportResult.AsyncState;

            try
            {
                ReadFrameComplete(transportResult);
            }
            catch (Exception e) {
                if (e is ThreadAbortException || e is StackOverflowException || e is OutOfMemoryException)
                {
                    throw;
                }

                if (!(e is IOException))
                {
                    e = new System.IO.IOException(SR.GetString(SR.net_io_readfailure, e.Message), e);
                }

                // Let's call user callback and he call us back and we will throw
                workerResult.InvokeCallback(e);
            }
        }
Beispiel #5
0
        public IAsyncResult BeginWriteMessage(byte[] message, AsyncCallback asyncCallback, object stateObject)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            _writeHeader.PayloadSize = message.Length;
            _writeHeader.CopyTo(_writeHeaderBuffer, 0);

            if (message.Length == 0)
            {
                return(_transportAPM.BeginWrite(_writeHeaderBuffer, 0, _writeHeaderBuffer.Length,
                                                asyncCallback, stateObject));
            }

            // Will need two async writes. Prepare the second:
            WorkerAsyncResult workerResult = new WorkerAsyncResult(this, stateObject, asyncCallback,
                                                                   message, 0, message.Length);

            // Charge the first:
            IAsyncResult result = _transportAPM.BeginWrite(_writeHeaderBuffer, 0, _writeHeaderBuffer.Length,
                                                           _beginWriteCallback, workerResult);

            if (result.CompletedSynchronously)
            {
                BeginWriteComplete(result);
            }

            return(workerResult);
        }
Beispiel #6
0
        public IAsyncResult BeginReadMessage(AsyncCallback asyncCallback, object stateObject)
        {
            WorkerAsyncResult workerResult;

            if (_eof)
            {
                workerResult = new WorkerAsyncResult(this, stateObject, asyncCallback, null, 0, 0);
                workerResult.InvokeCallback(-1);
                return(workerResult);
            }

            workerResult = new WorkerAsyncResult(this, stateObject, asyncCallback,
                                                 _readHeaderBuffer, 0,
                                                 _readHeaderBuffer.Length);

            IAsyncResult result = _transportAPM.BeginRead(_readHeaderBuffer, 0, _readHeaderBuffer.Length,
                                                          _readFrameCallback, workerResult);

            if (result.CompletedSynchronously)
            {
                ReadFrameComplete(result);
            }

            return(workerResult);
        }
Beispiel #7
0
        public void EndWriteMessage(IAsyncResult asyncResult)
        {
            if (asyncResult == null)
            {
                throw new ArgumentNullException("asyncResult");
            }

            WorkerAsyncResult workerResult = asyncResult as WorkerAsyncResult;

            if (workerResult != null)
            {
                if (!workerResult.InternalPeekCompleted)
                {
                    workerResult.InternalWaitForCompletion();
                }

                if (workerResult.Result is Exception)
                {
                    throw (Exception)(workerResult.Result);
                }
            }
            else
            {
                _transportAPM.EndWrite(asyncResult);
            }
        }
        public byte[] EndReadMessage(IAsyncResult asyncResult)
        {
            if (asyncResult == null)
            {
                throw new ArgumentNullException("asyncResult");
            }
            WorkerAsyncResult result = asyncResult as WorkerAsyncResult;

            if (result == null)
            {
                throw new ArgumentException(SR.GetString("net_io_async_result", new object[] { typeof(WorkerAsyncResult).FullName }), "asyncResult");
            }
            if (!result.InternalPeekCompleted)
            {
                result.InternalWaitForCompletion();
            }
            if (result.Result is Exception)
            {
                throw ((Exception)result.Result);
            }
            switch (((int)result.Result))
            {
            case -1:
                this.m_Eof = true;
                return(null);

            case 0:
                return(new byte[0]);
            }
            return(result.Buffer);
        }
        public IAsyncResult BeginWriteMessage(byte[] message, AsyncCallback asyncCallback, object stateObject)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }
            this.m_WriteHeader.PayloadSize = message.Length;
            this.m_WriteHeader.CopyTo(this.m_WriteHeaderBuffer, 0);
            if ((this.m_NetworkStream != null) && (message.Length != 0))
            {
                BufferOffsetSize[] buffers = new BufferOffsetSize[] { new BufferOffsetSize(this.m_WriteHeaderBuffer, 0, this.m_WriteHeaderBuffer.Length, false), new BufferOffsetSize(message, 0, message.Length, false) };
                return(this.m_NetworkStream.BeginMultipleWrite(buffers, asyncCallback, stateObject));
            }
            if (message.Length == 0)
            {
                return(this.Transport.BeginWrite(this.m_WriteHeaderBuffer, 0, this.m_WriteHeaderBuffer.Length, asyncCallback, stateObject));
            }
            WorkerAsyncResult state           = new WorkerAsyncResult(this, stateObject, asyncCallback, message, 0, message.Length);
            IAsyncResult      transportResult = this.Transport.BeginWrite(this.m_WriteHeaderBuffer, 0, this.m_WriteHeaderBuffer.Length, this.m_BeginWriteCallback, state);

            if (transportResult.CompletedSynchronously)
            {
                this.BeginWriteComplete(transportResult);
            }
            return(state);
        }
 private void BeginWriteCallback(IAsyncResult transportResult)
 {
     if (!transportResult.CompletedSynchronously)
     {
         WorkerAsyncResult asyncState = (WorkerAsyncResult)transportResult.AsyncState;
         try
         {
             this.BeginWriteComplete(transportResult);
         }
         catch (Exception exception)
         {
             if (((exception is ThreadAbortException) || (exception is StackOverflowException)) || (exception is OutOfMemoryException))
             {
                 throw;
             }
             asyncState.InvokeCallback(exception);
         }
     }
 }
        public IAsyncResult BeginReadMessage(AsyncCallback asyncCallback, object stateObject)
        {
            WorkerAsyncResult result;

            if (this.m_Eof)
            {
                result = new WorkerAsyncResult(this, stateObject, asyncCallback, null, 0, 0);
                result.InvokeCallback(-1);
                return(result);
            }
            result = new WorkerAsyncResult(this, stateObject, asyncCallback, this.m_ReadHeaderBuffer, 0, this.m_ReadHeaderBuffer.Length);
            IAsyncResult transportResult = this.Transport.BeginRead(this.m_ReadHeaderBuffer, 0, this.m_ReadHeaderBuffer.Length, this.m_ReadFrameCallback, result);

            if (transportResult.CompletedSynchronously)
            {
                this.ReadFrameComplete(transportResult);
            }
            return(result);
        }
Beispiel #12
0
        // IO COMPLETION CALLBACK
        //
        // Called when user IO request was wrapped to do several underlined IO
        //
        private void BeginWriteComplete(IAsyncResult transportResult)
        {
            do
            {
                WorkerAsyncResult workerResult = (WorkerAsyncResult)transportResult.AsyncState;

                //First, complete the previous portion write
                Transport.EndWrite(transportResult);
                //Check on exit criterion
                if (workerResult.Offset == workerResult.End)
                {
                    workerResult.InvokeCallback();
                    return;
                }
                //setup exit criterion
                workerResult.Offset = workerResult.End;
                //Write next portion (frame body) using Async IO
                transportResult = Transport.BeginWrite(workerResult.Buffer, 0, workerResult.End,
                                                       m_BeginWriteCallback, workerResult);
            }while (transportResult.CompletedSynchronously);
        }
Beispiel #13
0
        //
        //
        //
        //
        public IAsyncResult BeginWriteMessage(byte[] message, AsyncCallback asyncCallback, object stateObject)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            m_WriteHeader.PayloadSize = message.Length;
            m_WriteHeader.CopyTo(m_WriteHeaderBuffer, 0);

            if (m_NetworkStream != null && message.Length != 0)
            {
                BufferOffsetSize[] buffers = new BufferOffsetSize[2];
                buffers[0] = new BufferOffsetSize(m_WriteHeaderBuffer, 0, m_WriteHeaderBuffer.Length, false);
                buffers[1] = new BufferOffsetSize(message, 0, message.Length, false);
                return(m_NetworkStream.BeginMultipleWrite(buffers, asyncCallback, stateObject));
            }

            if (message.Length == 0)
            {
                return(Transport.BeginWrite(m_WriteHeaderBuffer, 0, m_WriteHeaderBuffer.Length,
                                            asyncCallback, stateObject));
            }
            //Will need two async writes
            // Prepare the second
            WorkerAsyncResult workerResult = new WorkerAsyncResult(this, stateObject, asyncCallback,
                                                                   message, 0, message.Length);
            // Charge the first
            IAsyncResult result = Transport.BeginWrite(m_WriteHeaderBuffer, 0, m_WriteHeaderBuffer.Length,
                                                       m_BeginWriteCallback, workerResult);

            if (result.CompletedSynchronously)
            {
                BeginWriteComplete(result);
            }

            return(workerResult);
        }
Beispiel #14
0
        //
        // User code will call this when workerResult gets signaled.
        //
        // On BeginRead, the user always gets back our WorkerAsyncResult.
        // The Result property represents either a number of bytes read or an
        // exception put by our async state machine.
        //
        public byte[] EndReadMessage(IAsyncResult asyncResult)
        {
            if (asyncResult == null)
            {
                throw new ArgumentNullException("asyncResult");
            }
            WorkerAsyncResult workerResult = asyncResult as WorkerAsyncResult;

            if (workerResult == null)
            {
                throw new ArgumentException(SR.Format(SR.net_io_async_result, typeof(WorkerAsyncResult).FullName), "asyncResult");
            }

            if (!workerResult.InternalPeekCompleted)
            {
                workerResult.InternalWaitForCompletion();
            }

            if (workerResult.Result is Exception)
            {
                throw (Exception)(workerResult.Result);
            }

            int size = (int)workerResult.Result;

            if (size == -1)
            {
                _eof = true;
                return(null);
            }
            else if (size == 0)
            {
                // Empty frame.
                return(new byte[0]);
            }

            return(workerResult.Buffer);
        }
Beispiel #15
0
        //
        // User code will call this when workerResult gets signaled.
        //
        // On BeginRead, the user always gets back our WorkerAsyncResult.
        // The Result property represents either a number of bytes read or an
        // exception put by our async state machine.
        //
        public byte[] EndReadMessage(IAsyncResult asyncResult)
        {
            if (asyncResult == null)
            {
                throw new ArgumentNullException(nameof(asyncResult));
            }
            WorkerAsyncResult workerResult = asyncResult as WorkerAsyncResult;

            if (workerResult == null)
            {
                throw new ArgumentException(SR.Format(SR.net_io_async_result, typeof(WorkerAsyncResult).FullName), nameof(asyncResult));
            }

            if (!workerResult.InternalPeekCompleted)
            {
                workerResult.InternalWaitForCompletion();
            }

            if (workerResult.Result is Exception e)
            {
                ExceptionDispatchInfo.Capture(e).Throw();
            }

            int size = (int)workerResult.Result;

            if (size == -1)
            {
                _eof = true;
                return(null);
            }
            else if (size == 0)
            {
                // Empty frame.
                return(Array.Empty <byte>());
            }

            return(workerResult.Buffer);
        }
 private void ReadFrameCallback(IAsyncResult transportResult)
 {
     if (!transportResult.CompletedSynchronously)
     {
         WorkerAsyncResult asyncState = (WorkerAsyncResult)transportResult.AsyncState;
         try
         {
             this.ReadFrameComplete(transportResult);
         }
         catch (Exception exception)
         {
             if (((exception is ThreadAbortException) || (exception is StackOverflowException)) || (exception is OutOfMemoryException))
             {
                 throw;
             }
             if (!(exception is IOException))
             {
                 exception = new IOException(SR.GetString("net_io_readfailure", new object[] { exception.Message }), exception);
             }
             asyncState.InvokeCallback(exception);
         }
     }
 }
        public void EndWriteMessage(IAsyncResult asyncResult)
        {
            if (asyncResult == null)
            {
                throw new ArgumentNullException("asyncResult");
            }
            WorkerAsyncResult result = asyncResult as WorkerAsyncResult;

            if (result != null)
            {
                if (!result.InternalPeekCompleted)
                {
                    result.InternalWaitForCompletion();
                }
                if (result.Result is Exception)
                {
                    throw ((Exception)result.Result);
                }
            }
            else
            {
                this.Transport.EndWrite(asyncResult);
            }
        }
Beispiel #18
0
        // IO COMPLETION CALLBACK
        //
        // Called when user IO request was wrapped to do several underlined IO.
        //
        private void BeginWriteComplete(IAsyncResult transportResult)
        {
            do
            {
                WorkerAsyncResult workerResult = (WorkerAsyncResult)transportResult.AsyncState !;

                // First, complete the previous portion write.
                TaskToApm.End(transportResult);

                // Check on exit criterion.
                if (workerResult.Offset == workerResult.End)
                {
                    workerResult.InvokeCallback();
                    return;
                }

                // Setup exit criterion.
                workerResult.Offset = workerResult.End;

                // Write next portion (frame body) using Async IO.
                transportResult = TaskToApm.Begin(_transport.WriteAsync(workerResult.Buffer !, 0, workerResult.End),
                                                  _beginWriteCallback, workerResult);
            }while (transportResult.CompletedSynchronously);
        }
Beispiel #19
0
        private void BeginWriteCallback(IAsyncResult transportResult)
        {
            GlobalLog.Assert(transportResult.AsyncState is WorkerAsyncResult, "StreamFramer::BeginWriteCallback|The state expected to be WorkerAsyncResult, received:{0}.", transportResult.AsyncState.GetType().FullName);
            if (transportResult.CompletedSynchronously)
            {
                return;
            }

            WorkerAsyncResult workerResult = (WorkerAsyncResult)transportResult.AsyncState;

            try
            {
                BeginWriteComplete(transportResult);
            }
            catch (Exception e)
            {
                if (e is ThreadAbortException || e is StackOverflowException || e is OutOfMemoryException)
                {
                    throw;
                }

                workerResult.InvokeCallback(e);
            }
        }
Beispiel #20
0
        public IAsyncResult BeginWriteMessage(byte[] message, AsyncCallback asyncCallback, object stateObject)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            _writeHeader.PayloadSize = message.Length;
            _writeHeader.CopyTo(_writeHeaderBuffer, 0);

            if (message.Length == 0)
            {
                return _transport.BeginWrite(_writeHeaderBuffer, 0, _writeHeaderBuffer.Length,
                                                   asyncCallback, stateObject);
            }

            // Will need two async writes. Prepare the second:
            WorkerAsyncResult workerResult = new WorkerAsyncResult(this, stateObject, asyncCallback,
                                                                   message, 0, message.Length);
            
            // Charge the first:
            IAsyncResult result = _transport.BeginWrite(_writeHeaderBuffer, 0, _writeHeaderBuffer.Length,
                                 _beginWriteCallback, workerResult);

            if (result.CompletedSynchronously)
            {
                BeginWriteComplete(result);
            }

            return workerResult;
        }
Beispiel #21
0
        public IAsyncResult BeginReadMessage(AsyncCallback asyncCallback, object stateObject)
        {
            WorkerAsyncResult workerResult;

            if (_eof)
            {
                workerResult = new WorkerAsyncResult(this, stateObject, asyncCallback, null, 0, 0);
                workerResult.InvokeCallback(-1);
                return workerResult;
            }

            workerResult = new WorkerAsyncResult(this, stateObject, asyncCallback,
                                                                   _readHeaderBuffer, 0,
                                                                   _readHeaderBuffer.Length);

            IAsyncResult result = _transport.BeginRead(_readHeaderBuffer, 0, _readHeaderBuffer.Length,
                _readFrameCallback, workerResult);

            if (result.CompletedSynchronously)
            {
                ReadFrameComplete(result);
            }

            return workerResult;
        }
Beispiel #22
0
        // IO COMPLETION CALLBACK
        //
        // This callback is responsible for getting the complete protocol frame.
        // 1. it reads the header.
        // 2. it determines the frame size.
        // 3. loops while not all frame received or an error.
        //
        private void ReadFrameComplete(IAsyncResult transportResult)
        {
            do
            {
                if (!(transportResult.AsyncState is WorkerAsyncResult))
                {
                    if (GlobalLog.IsEnabled)
                    {
                        GlobalLog.AssertFormat("StreamFramer::ReadFrameComplete|The state expected to be WorkerAsyncResult, received:{0}.", transportResult.GetType().FullName);
                    }

                    Debug.Fail("StreamFramer::ReadFrameComplete|The state expected to be WorkerAsyncResult, received:" + transportResult.GetType().FullName + ".");
                }

                WorkerAsyncResult workerResult = (WorkerAsyncResult)transportResult.AsyncState;

                int bytesRead = _transportAPM.EndRead(transportResult);
                workerResult.Offset += bytesRead;

                if (!(workerResult.Offset <= workerResult.End))
                {
                    if (GlobalLog.IsEnabled)
                    {
                        GlobalLog.AssertFormat("StreamFramer::ReadFrameCallback|WRONG: offset - end = {0}", workerResult.Offset - workerResult.End);
                    }

                    Debug.Fail("StreamFramer::ReadFrameCallback|WRONG: offset - end = " + (workerResult.Offset - workerResult.End));
                }

                if (bytesRead <= 0)
                {
                    // (by design) This indicates the stream has receives EOF
                    // If we are in the middle of a Frame - fail, otherwise - produce EOF
                    object result = null;
                    if (!workerResult.HeaderDone && workerResult.Offset == 0)
                    {
                        result = (object)-1;
                    }
                    else
                    {
                        result = new System.IO.IOException(SR.net_frame_read_io);
                    }

                    workerResult.InvokeCallback(result);
                    return;
                }

                if (workerResult.Offset >= workerResult.End)
                {
                    if (!workerResult.HeaderDone)
                    {
                        workerResult.HeaderDone = true;
                        // This indicates the header has been read succesfully
                        _curReadHeader.CopyFrom(workerResult.Buffer, 0, _readVerifier);
                        int payloadSize = _curReadHeader.PayloadSize;
                        if (payloadSize < 0)
                        {
                            // Let's call user callback and he call us back and we will throw
                            workerResult.InvokeCallback(new System.IO.IOException(SR.Format(SR.net_frame_read_size)));
                        }

                        if (payloadSize == 0)
                        {
                            // report emtpy frame (NOT eof!) to the caller, he might be interested in
                            workerResult.InvokeCallback(0);
                            return;
                        }

                        if (payloadSize > _curReadHeader.MaxMessageSize)
                        {
                            throw new InvalidOperationException(SR.Format(SR.net_frame_size,
                                                                          _curReadHeader.MaxMessageSize.ToString(NumberFormatInfo.InvariantInfo),
                                                                          payloadSize.ToString(NumberFormatInfo.InvariantInfo)));
                        }

                        // Start reading the remaining frame data (note header does not count).
                        byte[] frame = new byte[payloadSize];
                        // Save the ref of the data block
                        workerResult.Buffer = frame;
                        workerResult.End    = frame.Length;
                        workerResult.Offset = 0;

                        // Transport.BeginRead below will pickup those changes.
                    }
                    else
                    {
                        workerResult.HeaderDone = false; // Reset for optional object reuse.
                        workerResult.InvokeCallback(workerResult.End);
                        return;
                    }
                }

                // This means we need more data to complete the data block.
                transportResult = _transportAPM.BeginRead(workerResult.Buffer, workerResult.Offset, workerResult.End - workerResult.Offset,
                                                          _readFrameCallback, workerResult);
            } while (transportResult.CompletedSynchronously);
        }
        //
        //
        //
        //
        public IAsyncResult BeginWriteMessage(byte[] message, AsyncCallback asyncCallback, object stateObject) {
            if (message == null) {
                throw new ArgumentNullException("message");
            }

            m_WriteHeader.PayloadSize = message.Length;
            m_WriteHeader.CopyTo(m_WriteHeaderBuffer, 0);

            if (m_NetworkStream != null && message.Length != 0) {
                BufferOffsetSize[] buffers = new BufferOffsetSize[2];
                buffers[0] = new BufferOffsetSize(m_WriteHeaderBuffer, 0, m_WriteHeaderBuffer.Length, false);
                buffers[1] = new BufferOffsetSize(message, 0, message.Length, false);
                return m_NetworkStream.BeginMultipleWrite(buffers, asyncCallback, stateObject);
            }

            if (message.Length == 0) {
                return Transport.BeginWrite(m_WriteHeaderBuffer, 0, m_WriteHeaderBuffer.Length,
                                                   asyncCallback, stateObject);
            }
            //Will need two async writes
            // Prepare the second
            WorkerAsyncResult workerResult = new WorkerAsyncResult(this, stateObject, asyncCallback,
                                                                   message, 0, message.Length);
            // Charge the first
            IAsyncResult result = Transport.BeginWrite(m_WriteHeaderBuffer, 0, m_WriteHeaderBuffer.Length,
                                 m_BeginWriteCallback, workerResult);
            if (result.CompletedSynchronously)
            {
                BeginWriteComplete(result);
            }

            return workerResult;
        }