问题标签 [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 回答
812 浏览

c# - 如何使用 System.IO.Pipelines 包创建响应 TCP 侦听器?

我想使用 Kestrel 和 System.IO.Pipelines 包创建一个 TCP 侦听器。我收到的消息将始终是HL7 消息。一个示例消息可能是

MSH|^~&|MegaReg|XYZHospC|SuperOE|XYZImgCtr|20060529090131-0500||ADT^A01^ADT_A01|01052901|P|2.5 EVN||200605290901||||200605290900 PID|||56782445^^^UA ||KLEINSAMPLE^BARRY^Q^JR||19620910|M||2028-9^^HL70005^RA99113^^XYZ|260 古德温克雷斯特大道^^伯明翰^AL^35209^^M~尼克尔的泡菜^10000 W 100th AVE ^伯明翰^AL^35200^^O|||||||0105I30001^^^99DEF^AN PV1||I|W^389^1^UABH^^^^3||||12345^摩根^REX^ J^^^MD^0010^UAMC^L||67890^GRAINGER^LUCY^X^^^MD^0010^UAMC^L|MED|||||A0||13579^POTTER^SHERMAN^T^^^ MD^0010^UAMC^L|||||||||||||||||||||||||200605290900 OBX|1|NM|^体高||1.80|m^米^ISO+|||||F OBX|2|NM|^体重||79|kg^公斤^ISO+|||||F AL1|1||^阿司匹林 DG1|1||786.50^胸痛,未指定^I9|||A

唯一需要注意的是,每条传入的 HL7 消息都以垂直制表符开头,因此您知道消息从哪里开始。每个 HL7 消息都包含多个段,所以我想我必须遍历每个段。处理完请求后,我想发回一条 HL7 消息作为响应。首先我想出了这个

不幸的是,我在一些事情上苦苦挣扎:

  • 该部分int bytesRead = 32;,我如何知道已读取了多少字节?或者如何使用 writer 实例阅读?
  • 目前调试器不会在// ... Process the line .... 基本上我必须提取整个 HL7 消息,以便我可以使用我的 HL7 解析器来转换消息字符串。
  • 我必须在哪里回应?打电话后await ReadPipe(pipe.Input);?通过使用await connection.Transport.Output.WriteAsync(/* the HL7 message to send back */);
0 投票
1 回答
117 浏览

c# - PipeReader CancelPendingRead 不取消当前的读取操作

如果我用 取消当前读取,我希望能够开始另一个读取操作CancelPendingRead。但是这段代码抛出了一个InvalidOperationException. CancelPendingRead不像我想的那样工作,或者可能是什么问题?我正在使用 .Net Core 3.1 进行测试。

0 投票
2 回答
1443 浏览

c# - 为什么这个 System.IO.Pipelines 代码比基于 Stream 的代码慢得多?

我编写了一个小解析程序来比较 .NET Core 中的旧版本System.IO.Stream和新版本System.IO.Pipelines。我期望管道代码具有相同的速度或更快。但是,它慢了大约 40%。

程序很简单:它在 100Mb 的文本文件中搜索关键字,并返回关键字的行号。这是流版本:

我希望上面的流代码比下面的管道代码慢,因为流代码将字节编码为 StreamReader 中的字符串。管道代码通过对字节进行操作来避免这种情况:

以下是相关的辅助方法:

我在SequenceReader<byte>上面使用是因为我的理解是它比ReadOnlySequence<byte>;更智能/更快。当它可以在单个Span<byte>.

以下是基准测试结果 (.NET Core 3.1)。此 repo中提供了完整的代码和 BenchmarkDotNet 结果。

  • GetLineNumberWithStreamAsync - 435.6 毫秒,同时分配 366.19 MB
  • GetLineNumberUsingPipeAsync - 619.8 毫秒,同时分配 9.28 MB

我在管道代码中做错了吗?

更新:Evk 已经回答了这个问题。应用他的修复后,这里是新的基准数字:

  • GetLineNumberWithStreamAsync - 452.2 毫秒,同时分配 366.19 MB
  • GetLineNumberWithPipeAsync - 203.8 毫秒,分配 9.28 MB
0 投票
2 回答
1709 浏览

c# - 如何使用 PipeReader 读取 JSON 平面文件?

我正在尝试学习这个新的 system.io.pipelines,以及用于反序列化 json 的新 webapi 策略......

我编写了自己的 JsonConverter,但我无法找出从 json 平面文件夹具初始化 Utf9JsonReader 的正确方法。

这是测试:

当我调试它时, bytes.buffer 设置为 0 字节,即使 BookStoreJson.json 文件包含以下内容:

0 投票
1 回答
381 浏览

c# - 我可以拥有一个具有多个阅读器的 C# System.IO.Pipelines.Pipe 吗?

我在 .NET 5 中使用System.IO.Pipelines.Pipe将数据从流传输到读取器,现在我想我想要几个独立的读取器来处理相同的数据流。是否有一个 Pipe 的变体可以让我拥有几个相同的读者?

或者,如果我这样做,pipe2 是否会使用相同的段(即避免不必要的数据复制)?

0 投票
1 回答
55 浏览

c# - PipeWriter 和长度前缀消息

我正在尝试使用PipeWriter以字节长度为前缀的二进制消息。在整个消息完成之前,我不知道字节长度。这可以用 来完成PipeWriter吗?

基本上我正在尝试实现这三种方法:

这给了我预期的结果,但是PipeWrite.Advance状态文档:

调用 System.IO.Pipelines.PipeWriter.Advance(System.Int32) 后必须请求新的缓冲区才能继续写入更多数据;您无法写入先前获取的缓冲区。

PipeReader使用and方法可以轻松读取此类消息AdvanceTo(consumed,examined),其中我们仅在整个消息长度可用时才使用输入,但我无法PipeWriter根据文档提出正确的用法。

0 投票
1 回答
345 浏览

c# - TCP 服务器的 IDuplexPipe 示例实现

我最近发现了 System.IO.Pipelines 命名空间,它看起来很有趣。我一直在尝试在一个简单的 TCP 服务器的上下文中实现 IDuplexPipe 接口,该服务器接受连接,然后与连接的客户端来回通信。

但是,我正在努力使其稳定。感觉好像我误解了一些基本的东西。我也一直在搜索接口的参考实现,以指导我朝着正确的方向前进。

据我所知,这是关于 System.IO.Pipelines 的最完整的文档。我在下面提供的示例大量借鉴了它。

我的问题:在 TCP 服务器的上下文中,IDuplexPipe 接口的典型实现是什么样的?

顺便说一句,这就是我目前所拥有的。这个想法是通过提供已建立的 SslStream 来设置新的“双工通信”:

0 投票
1 回答
52 浏览

c# - 试图了解 IDuplexPipe

我正在开发一个围绕Binance 的 web socket stream 的web socket 包装器。System.IO.Pipelines 对我来说看起来很有趣,因为它解决了问题。

我很可能会采用以下实现之一:

我无法理解和之间的IDuplexPipe区别Pipe

IDuplexPipe 是支持读取和写入的类型的协定。例如,网络连接将由 IDuplexPipe 表示。

由于我正在处理的 Web 套接字包装器与 Binance 的 Web 套接字流有关,我假设我需要IDuplexPipe?

SignalR 使用IDuplexPipe并且 DotNet.Interactive.PowerShell 仅使用Pipe该类。您能否通过现实生活中的示例说明这两者之间的区别是什么,因为我不太了解微软的文档说明了什么。

0 投票
0 回答
85 浏览

c# - System.IO.Pipelines Socket.ReceiveAsync(套接字,内存) 与 PipeReader.Create(Socket.GetStream())

System.IO.Pipelines您可以通过以下方式从套接字读取和解析数据:

  • 创建一个并用一个直接从套接字接收Pipe的任务填充它,并使用另一个任务来解析来自管道的数据。PipeWriterSocket.ReceiveAsync()PipeReader

或者

  • PipeReader直接在来自套接字上使用任务NetworkStream来直接从流中解析数据PipeReader.Create(new NetworkStream(Socket)))

一种方式比另一种方式性能更高,还是性能差异可以忽略不计?