public static async Task <byte[]> ReadAsync(this PipeReader pipeReader, int numBytes) { while (true) { var result = await pipeReader.ReadAsync(); if (result.Buffer.Length < numBytes) { pipeReader.AdvanceTo(result.Buffer.Start, result.Buffer.End); continue; } var buffer = result.Buffer.Slice(0, numBytes); var bytes = buffer.ToArray(); pipeReader.AdvanceTo(buffer.End); return(bytes); } }
public static async Task <byte[]> ReadAllAsync(this PipeReader pipeReader) { while (true) { var result = await pipeReader.ReadAsync(); if (result.IsCompleted) { return(result.Buffer.ToArray()); } // Consume nothing, just wait for everything pipeReader.AdvanceTo(result.Buffer.Start, result.Buffer.End); } }
public static async Task <byte[]> ReadSingleAsync(this PipeReader pipeReader) { while (true) { var result = await pipeReader.ReadAsync(); try { return(result.Buffer.ToArray()); } finally { pipeReader.AdvanceTo(result.Buffer.End); } } }
public static async Task <ReadOnlyBuffer <byte> > ReadToEndAsync(this PipeReader input) { while (true) { // Wait for more data var result = await input.ReadAsync(); if (result.IsCompleted) { // Read all the data, return it return(result.Buffer); } // Don't advance the buffer so remains in buffer input.AdvanceTo(result.Buffer.Start, result.Buffer.End); } }
public static async Task CopyToAsync(this PipeReader input, Stream stream, int bufferSize, CancellationToken cancellationToken) { // TODO: Use bufferSize argument while (!cancellationToken.IsCancellationRequested) { var result = await input.ReadAsync(); var inputBuffer = result.Buffer; try { if (inputBuffer.IsEmpty && result.IsCompleted) { return; } await inputBuffer.CopyToAsync(stream); } finally { input.AdvanceTo(inputBuffer.End); } } }
private static async Task <int> ReadAsyncAwaited(this PipeReader input, ArraySegment <byte> destination) { while (true) { var result = await input.ReadAsync(); var inputBuffer = result.Buffer; var length = (int)Math.Min(inputBuffer.Length, destination.Count); var sliced = inputBuffer.Slice(0, length); sliced.CopyTo(destination); input.AdvanceTo(sliced.End); if (length != 0) { return(length); } if (result.IsCompleted) { return(0); } } }
public override void AdvanceTo(SequencePosition consumed) { LastConsumed = consumed; LastExamined = consumed; _inner.AdvanceTo(consumed); }