Span <T>и потоки в .NET Framework - PullRequest
0 голосов
/ 13 декабря 2018

Я работаю с сетевыми буферами и потоками, и Span и Memory будут идеально соответствовать требованиям приложения.

В соответствии с этим вопросом, я бы хотел, чтобы поток принимал Span в качестве параметра.Я знаю, что это реализовано в .NET Core 2.1, но мне было интересно, есть ли способ получить эту функциональность также в .NET Framework?(Я использую 4.7.1)

Что-то вроде:

Span<Byte> buffer = new Span<byte>();
stream.Read(buffer);

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Мне удалось решить эту проблему, написав метод расширения для класса Stream и реализовав стандартное поведение .NET Core для работы с Span.

    public static int Read(this Stream thisStream, Span<byte> buffer)
    {
        byte[] sharedBuffer = ArrayPool<byte>.Shared.Rent(buffer.Length);
        try
        {
            int numRead = thisStream.Read(sharedBuffer, 0, buffer.Length);
            if ((uint)numRead > (uint)buffer.Length)
            {
                throw new IOException(SR.IO_StreamTooLong);
            }
            new Span<byte>(sharedBuffer, 0, numRead).CopyTo(buffer);
            return numRead;
        }
        finally { ArrayPool<byte>.Shared.Return(sharedBuffer); }
    }

и

    public static void Write(this Stream thisStream, ReadOnlySpan<byte> buffer)
    {
        byte[] sharedBuffer = ArrayPool<byte>.Shared.Rent(buffer.Length);
        try
        {
            buffer.CopyTo(sharedBuffer);
            thisStream.Write(sharedBuffer, 0, buffer.Length);
        }
        finally { ArrayPool<byte>.Shared.Return(sharedBuffer); }
    }
0 голосов
/ 13 декабря 2018

К сожалению, поскольку эта функциональность еще не реализована в .Net Standard, она не включена в .Net Framework.

Редактировать: Я помню, что откуда-то читал, что есть предварительный выпуск пакета NuGet, который можно использовать с .Net Framework

Проверьте NuGet с помощью System.Memory

...