gpt4 book ai didi

c# - 从 ReadOnlySequence 获取连续的 Memory

转载 作者:太空狗 更新时间:2023-10-29 20:32:46 28 4
gpt4 key购买 nike

在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com