<PackageReference Include="System.Text.Json" Version="10.0.0-preview.2.25163.2" />

StreamExtensions

static class StreamExtensions
using System.Buffers; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; namespace System.IO { internal static class StreamExtensions { public static ValueTask<int> ReadAsync(this Stream stream, Memory<byte> buffer, CancellationToken cancellationToken = default(CancellationToken)) { if (MemoryMarshal.TryGetArray(buffer, out ArraySegment<byte> segment)) return new ValueTask<int>(stream.ReadAsync(segment.Array, segment.Offset, segment.Count, cancellationToken)); byte[] array = ArrayPool<byte>.Shared.Rent(buffer.Length); return <ReadAsync>g__FinishReadAsync|0_0(stream.ReadAsync(array, 0, buffer.Length, cancellationToken), array, buffer); } public static void Write(this Stream stream, ReadOnlyMemory<byte> buffer) { if (MemoryMarshal.TryGetArray(buffer, out ArraySegment<byte> segment)) stream.Write(segment.Array, segment.Offset, segment.Count); else { byte[] array = ArrayPool<byte>.Shared.Rent(buffer.Length); try { buffer.Span.CopyTo(array); stream.Write(array, 0, buffer.Length); } finally { ArrayPool<byte>.Shared.Return(array, false); } } } public static ValueTask WriteAsync(this Stream stream, ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default(CancellationToken)) { if (MemoryMarshal.TryGetArray(buffer, out ArraySegment<byte> segment)) return new ValueTask(stream.WriteAsync(segment.Array, segment.Offset, segment.Count, cancellationToken)); byte[] array = ArrayPool<byte>.Shared.Rent(buffer.Length); buffer.Span.CopyTo(array); return new ValueTask(FinishWriteAsync(stream.WriteAsync(array, 0, buffer.Length, cancellationToken), array)); } [AsyncStateMachine(typeof(<FinishWriteAsync>d__3))] private static Task FinishWriteAsync(Task writeTask, byte[] localBuffer) { <FinishWriteAsync>d__3 stateMachine = default(<FinishWriteAsync>d__3); stateMachine.<>t__builder = AsyncTaskMethodBuilder.Create(); stateMachine.writeTask = writeTask; stateMachine.localBuffer = localBuffer; stateMachine.<>1__state = -1; stateMachine.<>t__builder.Start(ref stateMachine); return stateMachine.<>t__builder.Task; } public static Task CopyToAsync(this Stream source, Stream destination, CancellationToken cancellationToken = default(CancellationToken)) { return source.CopyToAsync(destination, 81920, cancellationToken); } } }