是否可以像从套接字一样将输入以块的形式提交给 FParsec 解析器?如果没有,是否可以检索输入流的当前结果和未解析部分,以便我可以完成此操作?我正在尝试运行来自 SocketAsyncEventArgs
的输入块无需缓冲整个消息。
更新
注意使用SocketAsyncEventArgs
的原因表示将数据发送到 CharStream
可能会导致异步访问底层 Stream
.具体来说,我正在考虑使用循环缓冲区来推送来自套接字的数据。我记得 FParsec 文档指出底层 Stream
不应该异步访问,所以我计划手动控制分块解析。
终极问题:
Stream
下使用循环缓冲区吗?传递给 CharStream
? 最佳答案
FParsec 的普通版本(虽然不是 Low-Trust version )读取输入的块方式,或“块方式”,正如我在 CharStream
documentation 中所说的那样。 .因此,如果你构造一个 CharStream
来自 System.IO.Stream
并且内容足够大,可以跨越多个 CharStream
块,您可以在完全检索输入之前开始解析。
但是请注意,CharStream
将以固定(但可配置)大小的块消耗输入流,即它将调用 Read
System.IO.Stream
的方法尽可能频繁地填充一个完整的块。因此,如果您解析输入的速度比检索新输入的速度快,CharStream
即使已经有一些未解析的输入,也可能会阻塞,因为还没有足够的输入来填充一个完整的块。
更新
终极问题的答案:42。
Stream
从中构建 CharStream
完全取决于你。您记得的排除并行访问的限制仅适用于 CharStream
类,这不是线程安全的。 Stream
作为循环缓冲区可能会restrict the maximum distance over which you can backtrack. CharStream
的块大小当 Stream
出现时,您可以回溯多远影响不支持求。 BlockingStream
这样的流类。在您在下面的第二条评论中链接的文章中进行了描述。 关于parsing - 使用 FParsec 进行分块解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8891019/