问题标签 [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.
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 */);
?
c# - PipeReader CancelPendingRead 不取消当前的读取操作
如果我用 取消当前读取,我希望能够开始另一个读取操作CancelPendingRead
。但是这段代码抛出了一个InvalidOperationException
. CancelPendingRead
不像我想的那样工作,或者可能是什么问题?我正在使用 .Net Core 3.1 进行测试。
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
c# - 如何使用 PipeReader 读取 JSON 平面文件?
我正在尝试学习这个新的 system.io.pipelines,以及用于反序列化 json 的新 webapi 策略......
我编写了自己的 JsonConverter,但我无法找出从 json 平面文件夹具初始化 Utf9JsonReader 的正确方法。
这是测试:
当我调试它时, bytes.buffer 设置为 0 字节,即使 BookStoreJson.json 文件包含以下内容:
c# - 我可以拥有一个具有多个阅读器的 C# System.IO.Pipelines.Pipe 吗?
我在 .NET 5 中使用System.IO.Pipelines.Pipe将数据从流传输到读取器,现在我想我想要几个独立的读取器来处理相同的数据流。是否有一个 Pipe 的变体可以让我拥有几个相同的读者?
或者,如果我这样做,pipe2 是否会使用相同的段(即避免不必要的数据复制)?
c# - PipeWriter 和长度前缀消息
我正在尝试使用PipeWriter
以字节长度为前缀的二进制消息。在整个消息完成之前,我不知道字节长度。这可以用 来完成PipeWriter
吗?
基本上我正在尝试实现这三种方法:
这给了我预期的结果,但是PipeWrite.Advance
状态文档:
调用 System.IO.Pipelines.PipeWriter.Advance(System.Int32) 后必须请求新的缓冲区才能继续写入更多数据;您无法写入先前获取的缓冲区。
PipeReader
使用and方法可以轻松读取此类消息AdvanceTo(consumed,examined)
,其中我们仅在整个消息长度可用时才使用输入,但我无法PipeWriter
根据文档提出正确的用法。
c# - TCP 服务器的 IDuplexPipe 示例实现
我最近发现了 System.IO.Pipelines 命名空间,它看起来很有趣。我一直在尝试在一个简单的 TCP 服务器的上下文中实现 IDuplexPipe 接口,该服务器接受连接,然后与连接的客户端来回通信。
但是,我正在努力使其稳定。感觉好像我误解了一些基本的东西。我也一直在搜索接口的参考实现,以指导我朝着正确的方向前进。
据我所知,这是关于 System.IO.Pipelines 的最完整的文档。我在下面提供的示例大量借鉴了它。
- https://github.com/davidfowl/DocsStaging/blob/master/Pipelines.md
- https://devblogs.microsoft.com/dotnet/system-io-pipelines-high-performance-io-in-net/
我的问题:在 TCP 服务器的上下文中,IDuplexPipe 接口的典型实现是什么样的?
顺便说一句,这就是我目前所拥有的。这个想法是通过提供已建立的 SslStream 来设置新的“双工通信”:
c# - 试图了解 IDuplexPipe
我正在开发一个围绕Binance 的 web socket stream 的web socket 包装器。System.IO.Pipelines 对我来说看起来很有趣,因为它解决了问题。
我很可能会采用以下实现之一:
- 信号R
- BotBuilder(不确定该项目到底是什么)
- DotNet.Interactive.PowerShell
- 一个可能受到微软实施启发的项目
我无法理解和之间的IDuplexPipe
区别Pipe
。
IDuplexPipe 是支持读取和写入的类型的协定。例如,网络连接将由 IDuplexPipe 表示。
由于我正在处理的 Web 套接字包装器与 Binance 的 Web 套接字流有关,我假设我需要IDuplexPipe
?
SignalR 使用IDuplexPipe
并且 DotNet.Interactive.PowerShell 仅使用Pipe
该类。您能否通过现实生活中的示例说明这两者之间的区别是什么,因为我不太了解微软的文档说明了什么。
c# - System.IO.Pipelines Socket.ReceiveAsync(套接字,内存) 与 PipeReader.Create(Socket.GetStream())
System.IO.Pipelines
您可以通过以下方式从套接字读取和解析数据:
- 创建一个并用一个直接从套接字接收
Pipe
的任务填充它,并使用另一个任务来解析来自管道的数据。PipeWriter
Socket.ReceiveAsync()
PipeReader
或者
PipeReader
直接在来自套接字上使用任务NetworkStream
来直接从流中解析数据PipeReader.Create(new NetworkStream(Socket)))
一种方式比另一种方式性能更高,还是性能差异可以忽略不计?