/
dev-npgsql
/
npgsql
Обзор
Документация
Войти
/
dev-npgsql
/
npgsql
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
v6.0.11
src/Npgsql/Shims/StreamExtensions.cs
71 строка
2 KB
Shay Rojansky
Implementation of the ADO.NET batching API (#3860)
16 авг 2021, 14:08
Не верифицирован
16 авг 2021, 14:08
0d8dd34
Код
Авторство
О чём код?
#if NETSTANDARD2_0 using System.Buffers; using System.Threading; using System.Threading.Tasks; // ReSharper disable once CheckNamespace namespace System.IO { // Helpers to read/write Span/Memory<byte> to Stream before netstandard 2.1 static class StreamExtensions { public static int Read(this Stream stream, Span<byte> buffer) { var sharedBuffer = ArrayPool<byte>.Shared.Rent(buffer.Length); try { var numRead = stream.Read(sharedBuffer, 0, buffer.Length); new Span<byte>(sharedBuffer, 0, numRead).CopyTo(buffer); return numRead; } finally { ArrayPool<byte>.Shared.Return(sharedBuffer); } } public static async ValueTask<int> ReadAsync(this Stream stream, Memory<byte> buffer, CancellationToken cancellationToken = default) { var sharedBuffer = ArrayPool<byte>.Shared.Rent(buffer.Length); try { var result = await stream.ReadAsync(sharedBuffer, 0, buffer.Length, cancellationToken); new Span<byte>(sharedBuffer, 0, result).CopyTo(buffer.Span); return result; } finally { ArrayPool<byte>.Shared.Return(sharedBuffer); } } public static void Write(this Stream stream, ReadOnlySpan<byte> buffer) { var sharedBuffer = ArrayPool<byte>.Shared.Rent(buffer.Length); try { buffer.CopyTo(sharedBuffer); stream.Write(sharedBuffer, 0, buffer.Length); } finally { ArrayPool<byte>.Shared.Return(sharedBuffer); } } public static async ValueTask WriteAsync(this Stream stream, ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default) { var sharedBuffer = ArrayPool<byte>.Shared.Rent(buffer.Length); buffer.Span.CopyTo(sharedBuffer); try { await stream.WriteAsync(sharedBuffer, 0, buffer.Length, cancellationToken); } finally { ArrayPool<byte>.Shared.Return(sharedBuffer); } } } } #endif