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.GetResult(); var sliced = inputBuffer.Slice(0, count); sliced.CopyTo(buffer, offset); 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(buffer, offset, count))); }