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); }