问题标签 [system.io.pipelines]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
950 浏览

c# - Pipelines.Sockets.Unofficial.SocketConnection 是否会在没有请求的情况下刷新?

我正在使用 Marc Gravell 的 Pipelines.Sockets.Unofficial 库通过套接字获取 IDuplexPipe,但我发现需要在刷新之前修改消息头的情况。如果我调用 Advance,我是否保证在调用 FlushAsync 之前它永远不会刷新?类型暗示了这一点(Advance 是同步的,而 Flush 不是),但我希望有人能给出明确的答案。

另外,在我通过缓冲区后,我可以明智地写入缓冲区中的某个点吗?

0 投票
1 回答
757 浏览

.net - 如何检测 PipeReader 何时到达数据源的末端(管道末端)?

我们可以调用 ReadAsync() 并检查缓冲区中的读取字节...

如果在调用 ReadAsync 之前长度没有增加,这是否表明管道结束(没有更多字节要读取)?如果不是,那么检测“管道末端”的正确方法是什么?

我们可以像这样表示缓冲区中字节的消耗:

然后检查是否有任何未消耗的字节,或者未来提供字节的可能性(即生产者尚未发出信号,它已停止向管道添加新字节)

但是,如果我在缓冲区中寻找一个(或多个)序列,并在使用它之前等待一个完整的序列,那么即使缓冲区包含所有可用字节并且生产者已发出完成信号,IsComplete 似乎仍然为假。

谢谢。

0 投票
1 回答
1310 浏览

c# - System.Text.Json:从 System.IO.Pipelines 反序列化

我正在使用来自 TcpClient 的 Json,为了获得低分配和良好性能的解决方案,我决定使用新的解决方案System.IO.Pipelines来处理 IO 和System.Text.Json反序列化。管道的输出是一个ReadOnlySequence<byte>. 当 中只有一个段时我没问题ReadOnlySequence,这样我就可以将此段(即 a ReadOnlySpan<byte>)传递给反序列化器。但是我应该如何处理多个细分?

到目前为止,我所拥有的是下面的代码。但在某些情况下,序列的长度太大,所以我在stackalloc. 此外,在我看来,制作数据副本违反了 System.IO.Pipelines 的意图。不应该System.Text.Json.JsonSerializer.Deserialize超载ReadOnlySequence吗?关于如何解决这个问题的任何建议?

0 投票
1 回答
533 浏览

c# - ReadOnlySequence 上的操作

我正在对 System.IO.Pipelines 进行一些试验,但无法找到转换或使用返回的 ReadOnlySequence 对象的最佳方法。

我能够用它做任何事情的唯一方法是将它转换为一个数组,然后执行普通的字节函数,例如给出以下内容:

对 Buffer 进行操作:

如果不转换为数组,我不知道该怎么做:

测试缓冲区中的特定字节

将字节缓冲区复制到结构

是通过将 ReadOnlySequence 转回数组来访问其内容的唯一方法吗?

0 投票
2 回答
1157 浏览

c# - 获得一个跨度在结构上而不复制结构

我一直在尝试Span<T>作为ReadOnlySequence<T>System.IO.Pipelines 的一部分。

我目前正在尝试在不使用代码且不制作副本的情况下获得 a Span<T>over a 。structunsafestruct

我的结构很简单:

方法 1 - 有效 - 但感觉“不安全”

方法 2 - 它不能按预期工作,因为它需要一个副本

进一步的研究表明,

Span<T>可以从 a 隐式转换byte[],例如,我可以这样做

但是我拥有的任何当前 ToByteArray() 实现仍在制作 Packet 结构的副本。

我不能做一些类似的事情:

0 投票
1 回答
993 浏览

c# - 复制 ReadOnlySequence 的更好方法到一个结构

所以我最近一直在System.BuffersReadOnlySequence<T>班级一起工作。

我有一个用以下定义的原语结构:

我可以毫无问题地在网络上来回传递它,我正在利用System.IO.Pipelines这一点。

ReadOnlySequence<byte>背部转换为结构引起了一些头痛。

我从这个开始:

它在服务器的整个生命周期中创建了数千个小字节 [] 数组(这本身没有问题),但是系统尝试执行的所有其他操作都给 GC 带来了一些额外的压力。

所以我已经开始使用:

这不会做任何内存分配,但我只是觉得应该有更好的方法。

foreach循环和to MemoryMarshal.Cast()amessageHeader[1]这样我就可以提取元素 0 有点像我在阅读源代码时偶然发现的黑客行为。

我找不到一个 API 来干净地将内容提取ReadOnlySequence<bytes>messageHeader.

编辑1:

我只是偶然发现BuffersExtensions.CopyTo<T>(ReadOnlySequence<T>, Span<T>)可以用它替换 foreach 循环。

0 投票
1 回答
649 浏览

system.io.pipelines - 只读序列从 ReadOnlySequence 转换?

我正在尝试使用 System.IO.Pipelines 来解析大型文本文件。

但是我找不到从 ReadOnlySequence 到 ReadOnlySequence 的转换函数。例如像MemoryMarshal.Cast<byte,char>.

ReadOnlySequence<T>恕我直言,如果只有一种特定类型(字节)适用,那么拥有泛型是毫无用处的。

0 投票
1 回答
177 浏览

c# - 从 PipeReader 读取超时

目前我正在使用以下实用程序扩展来读取PipeReader具有指定超时的 a。超时需要Keep-Alive在 HTTP 服务器中正确实现。

这段代码在几个方面存在问题,因为它引入了锁定(内部Task.Delay)、大量分配和一个要由 CPU 处理的线程。

有没有更有效的方法来使用PipeReader读取超时?

0 投票
1 回答
100 浏览

c# - 我可以在同步模式下使用 System.IO.Pipelines 吗?

我目前正在使用 System.IO.Pipelines 来构建客户端-服务器应用程序。一旦每个客户端启动,它应该请求服务器提供一些配置,以便它知道要做什么。目前的情况是 System.IO.Pipelines 在异步模式下工作,这意味着客户端向服务器发送请求而不等待响应。服务器在后台获取客户端的请求,处理并发送响应,客户端在后台获取响应并呈现在屏幕上。

我想创建一种机制,让客户端在继续之前等待服务器响应。我目前的解决方案基于:

https://github.com/davidfowl/TcpEcho

https://github.com/gfoidl/TcpEcho

希望在继续使用管道的同时获得您的帮助(我知道我可以使用简单的缓冲区来完成它,但我确实想享受管道库的优势)

0 投票
1 回答
191 浏览

c# - 管道缓冲区保留直到处理完成

我正在研究使用管道处理来自网络的二进制消息的可能性。我将要处理的二进制消息带有一个有效负载,最好将有效负载保持为二进制形式。

这个想法是读出整个消息并创建一个消息片段及其有效负载,一旦消息被完全读取,它将被传递到通道链进行处理,处理不会是即时的,可能需要一些时间或被执行稍后,目标是不要让管道阅读器等到处理完成,然后一旦消息处理完成,我需要将处理后的缓冲区释放给管道编写器。

现在我当然可以创建一个新的字节数组并复制来自管道写入器的数据,但这会超出不复制的目的吗?所以据我了解,我需要管道和通道之间的一些缓冲区同步?我观察了管道阅读器的可用 api ( AdvanceTo ),它可以告诉管道阅读器消耗了什么以及检查了什么,但无法解决如何在管道读取方法之外同步它。

所以问题是是否有一些技术或例子来说明如何实现这一点。