public static async Task <byte[]> ReadAllAsync(this PipeReader pipeReader) { while (true) { var result = await pipeReader.ReadAsync(); try { if (result.IsCompleted) { return(result.Buffer.ToArray()); } } finally { // Consume nothing, just wait for everything pipeReader.AdvanceTo(result.Buffer.Start, result.Buffer.End); } } }
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 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 async ValueTask <ReadResult> ReadAsync(CancellationToken cancellationToken = default) { LastReadResult = await _inner.ReadAsync(cancellationToken); return(LastReadResult); }