public static ValueTask <int> ReadAsync(this IReadableChannel input, Span <byte> destination) { while (true) { var awaiter = input.ReadAsync(); if (!awaiter.IsCompleted) { break; } var fin = input.Completion.IsCompleted; var inputBuffer = awaiter.GetResult(); var sliced = inputBuffer.Slice(0, destination.Length); sliced.CopyTo(destination); int actual = sliced.Length; inputBuffer.Consumed(sliced.End); if (actual != 0) { return(new ValueTask <int>(actual)); } else if (fin) { return(new ValueTask <int>(0)); } } return(new ValueTask <int>(input.ReadAsyncAwaited(destination))); }
public static ValueTask <int> ReadAsync(this IReadableChannel input, byte[] buffer, int offset, int count) { while (input.IsCompleted) { var fin = input.Completion.IsCompleted; var begin = input.BeginRead().Begin; int actual; var end = begin.CopyTo(buffer, offset, count, out actual); input.EndRead(end); if (actual != 0) { return(new ValueTask <int>(actual)); } else if (fin) { return(new ValueTask <int>(0)); } } return(new ValueTask <int>(input.ReadAsyncAwaited(buffer, offset, count))); }
public static ValueTask <int> ReadAsync(this IReadableChannel input, byte[] buffer, int offset, int count) { while (input.IsCompleted) { var fin = input.Completion.IsCompleted; var inputBuffer = input.BeginRead(); var sliced = inputBuffer.Slice(0, count); sliced.CopyTo(buffer, offset); int actual = sliced.Length; input.EndRead(sliced); if (actual != 0) { return(new ValueTask <int>(actual)); } else if (fin) { return(new ValueTask <int>(0)); } } return(new ValueTask <int>(input.ReadAsyncAwaited(buffer, offset, count))); }