public void Send(byte[] buffer)
        {
            int            bytesReceived;
            ReceiveRequest receiveToComplete = null;

            lock (this.excessBuffers)
            {
                this.ThrowIfDisposed();
                if (this.pendingReceive != null)
                {
                    bytesReceived       = this.pendingReceive.AddData(buffer);
                    receiveToComplete   = this.pendingReceive;
                    this.pendingReceive = null;
                }
                else
                {
                    bytesReceived = 0;
                }

                this.AddExcess(buffer, bytesReceived, false);
            }

            if (receiveToComplete != null)
            {
                receiveToComplete.Complete();
            }
        }
        private void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (!this.disposed)
                {
                    ReceiveRequest requestToComplete = null;
                    lock (this.excessBuffers)
                    {
                        if (!this.disposed)
                        {
                            if (this.pendingReceive != null)
                            {
                                requestToComplete   = this.pendingReceive;
                                this.pendingReceive = null;
                            }

                            this.disposed = true;
                        }
                    }

                    if (requestToComplete != null)
                    {
                        requestToComplete.Complete();
                    }
                }
            }
        }
        public Task <int> ReceiveAsync(byte[] buffer)
        {
            Task <int>     task;
            ReceiveRequest receiveToComplete = null;

            lock (this.excessBuffers)
            {
                this.ThrowIfDisposed();
                if (this.pendingReceive != null)
                {
                    throw new InvalidOperationException("A receive operation is already in progress.");
                }

                this.pendingReceive = new ReceiveRequest(buffer);
                task = this.pendingReceive.Task;

                while ((this.excessBuffers.Count > 0) && (this.pendingReceive.RemainingBytes > 0))
                {
                    receiveToComplete = this.pendingReceive;
                    byte[] excess = this.excessBuffers.First.Value;
                    this.excessBuffers.RemoveFirst();
                    int bytesReceived = this.pendingReceive.AddData(excess);
                    this.AddExcess(excess, bytesReceived, true);
                }

                if (receiveToComplete != null)
                {
                    this.pendingReceive = null;
                }
            }

            if (receiveToComplete != null)
            {
                receiveToComplete.Complete();
            }

            return(task);
        }