c# - .NET 框架中的 Span<T> 和流

标签 c# .net .net-4.7.1

我正在处理网络缓冲区和流,Span 和 Memory 非常适合应用程序要求。

根据 this问题,我想让一个 Stream 接受 Span 作为参数。我知道这是在 .NET Core 2.1 中实现的,但我想知道是否也有办法在 .NET Framework 中获得此功能? (我用的是4.7.1)

类似于:

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

最佳答案

我设法通过为 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); }
    }

关于c# - .NET 框架中的 Span<T> 和流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53759949/

相关文章:

c# - 如何使用 sendmessage 和 c# 增加第三方应用程序中轨迹栏/ slider 的值(value)?

c# - 如何在WebAPI中限制对DB资源的访问

.NET 客户端使用 AXIS 1.4 SSL Webservice 所有异常 "INTERNAL SERVER ERROR"

amazon-web-services - 使用 Microsoft.Configuration.ConfigurationBuilders 的 AWS SSM 自定义提供程序

c# - 调用 RegisterAllAreas 时出现 FatalExecutionEngineError

c# - 在 C# 中使用 TextBox 为记事本创建查找功能

C# 和 MongoDB 使用 ObjectId 列表删除记录

c# - Dictionary<,> 索引器中使用离散键并发写入的线程安全

.net - 日志框架与 System.Diagnostics 跟踪

.net - 在通过反射加载的 .NET Framework 4.7.1 库上执行方法时,System.Net.Http MethodNotFoundException