public override void Flush() { int bytesWrittenToBuffer = _currentBuffer.BytesWritten; _currentBuffer = WriteBufferWrapper.EmptyContainer; _dataAvail.TrySetResult(bytesWrittenToBuffer); }
public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { if (buffer == null) { throw new ArgumentNullException("buffer"); } if (offset < 0 || offset > buffer.Length) { throw new ArgumentOutOfRangeException("offset"); } if (count < 0 || count > buffer.Length - offset) { throw new ArgumentOutOfRangeException("count"); } cancellationToken.ThrowIfCancellationRequested(); if (_disposed) { throw new ObjectDisposedException("ProducerConsumerStream"); } using (cancellationToken.Register(CancelAndDispose, this)) { while (count > 0) { if (_currentBuffer == WriteBufferWrapper.EmptyContainer) { _currentBuffer = await _buffer.Task; _buffer = new TaskCompletionSource <WriteBufferWrapper>(); } int bytesWritten = _currentBuffer.Write(buffer, offset, count); count -= bytesWritten; offset += bytesWritten; if (_currentBuffer.Count == 0) { _currentBuffer = WriteBufferWrapper.EmptyContainer; } _dataAvail.TrySetResult(bytesWritten); } } }
public ProducerConsumerStream() { _buffer = new TaskCompletionSource <WriteBufferWrapper>(); _dataAvail = new TaskCompletionSource <int>(); _currentBuffer = WriteBufferWrapper.EmptyContainer; }