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);
}
}
}