public sealed override bool ReadAsync()

in src/Transport/TcpTransport.cs [92:142]


        public sealed override bool ReadAsync(TransportAsyncCallbackArgs args)
        {
            Fx.Assert(args.Buffer != null, "must have buffer(s) to read");
            Fx.Assert(args.CompletedCallback != null, "must have a valid callback");
            Fx.Assert(this.receiveEventArgs.Args == null, "read is pending");

            ByteBuffer readBuffer = this.receiveEventArgs.PrepareRead(args.Count);
            if (readBuffer != null)
            {
                // ensure the buffer is not reclaimed while read is pending
                // ref count is decremented in read complete handler
                this.receiveEventArgs.UserToken = readBuffer.AddReference();

                if (readBuffer.Length > 0)
                {
                    this.HandleReadComplete(args, true, true);
                    return false;
                }

                this.receiveEventArgs.SetBuffer(readBuffer.Buffer, readBuffer.Offset, readBuffer.Size);
            }
            else
            {
                this.receiveEventArgs.SetReadBuffer(args);
            }

            this.receiveEventArgs.Args = args;
            Fx.Assert(this.receiveEventArgs.Count > 0, "Must have a count to read");
            bool pending;
            try
            {
                pending = this.socket.ReceiveAsync(this.receiveEventArgs);
            }
            catch
            {
                if (readBuffer != null)
                {
                    readBuffer.Dispose();
                }

                throw;
            }

            if (!pending)
            {
                this.HandleReadComplete(args, false, true);
                return false;
            }

            return true;
        }