- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 Marc Gravell 的 blog post 上对管道进行了精彩介绍之后关于这个主题,我正在尝试用套接字实现管道。
我知道 Marc 已经想出了 Pipelines.Sockets.Unofficial,我将其用作引用,但我有一个问题。
似乎SocketAsyncEventArgs
SetBuffer()
有一个新的过载方法:SetBuffer(Memory<byte>)
看来这里的意图是与管道很好地集成。
我的困惑是因为 Pipe.Reader.ReadAsync()
返回 ReadResult
包含 ReadOnlySequence<byte>
( ReadResult.Buffer
)
如果Buffer.IsSingleSegment == true
,很明显该怎么做:
SocketAsyncEventArgs.SetBuffer(Buffer[0])
但在有多个 分割的情况下,我不完全确定最佳行动方案是什么。
我当然可以得到一个 byte[]
从管道中取出并完成它,但这会产生一个副本(甚至可能不止一个)。
ReadOnlySequence<byte>
的预期用途是什么?这里?有没有办法让“内存”代表序列的全部内容?
也许我需要重新阅读 Marc 的博文...
最佳答案
我所看到的:有这个 ReadOnlySequence<>.First
如果是 IsSingleSegment
应该给你ReadOnlyMemory<>
你正在寻找。对于具有更多片段的序列,我认为您应该使用
var iSegment = seq.Start;
ReadOnlyMemory<byte> readMemory;
while(seq.TryGet(ref iSegment, out readMemory, advance: true))
{ /* do smth */ }
或者我认为,这做同样的事情:
foreach(var memory in seq)
{ /* do smth */ }
如果您关心性能并且不想复制整个缓冲区(这就是 .ToArray() 扩展方法所做的),那么迭代是有意义的。
恕我直言,目的是有效地表示非连续缓冲区。
我不确定 Sequence<>
实现细节,但在大多数缓冲场景中,通常会保存几个小缓冲区 (3, 2) 并在它们之间切换,以免不必要地分配新内存。这有时被抽象为“循环”或“环形”缓冲区。
它会导致像 Sequence<>
这样的“顺序”内存访问模式.
关于c# - 从 ReadOnlySequence<byte> 获取连续的 Memory<byte>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51792518/
所以我开始尝试使用 Span 来解析消息代码。虽然 api 看起来很容易理解,但我似乎找不到任何方法将切片转换为值。例如,我想将 ReadOnlySequence 转换为 int。当然,我可以调用 T
我使用的是 .NET Standard 2.1 Preview 8。我构建了一个小程序,基本上从 TcpSocket 写入/读取。读取是通过 Pipe 完成的。 给出以下实现 var pipe = n
我尝试从 ReadOnlySequence 中读取一些数据。数据被格式化为帧。每个帧都以 NULL 字节(八位字节 0)结束。 我的代码使用 ReadOnlySequence.PositionOf 搜
如何从 ReadOnlySequence 解析 UTF8 字符串 ReadOnlySequence 由部分组成,由于 UTF8 字符是可变长度的,因此部分中的中断可能位于字符的中间。因此,仅在部件上使
在 Marc Gravell 的 blog post 上对管道进行了精彩介绍之后关于这个主题,我正在尝试用套接字实现管道。 我知道 Marc 已经想出了 Pipelines.Sockets.Unoff
我是一名优秀的程序员,十分优秀!