是否可以像从套接字一样以块的形式向 FParsec 解析器提交输入?如果没有,是否可以检索输入流的当前结果和未解析部分,以便我可以完成此任务?我正在尝试运行来自的输入块 SocketAsyncEventArgs 无需缓冲整个消息。

更新

注意到使用的原因 SocketAsyncEventArgs 表示将数据发送到 CharStream 可能会导致对底层的异步访问 Stream. 。具体来说,我正在考虑使用循环缓冲区来推送来自套接字的数据。我记得 FParsec 文档指出底层 Stream 不应该异步访问,所以我计划手动控制分块解析。

最终问题:

  1. 我可以在我的下使用循环缓冲区吗 Stream 传递给 CharStream?
  2. 在这种情况下我不需要担心手动控制分块吗?
有帮助吗?

解决方案

FParsec 的普通版本(尽管不是 低信任版本)按块或“按块”读取输入,正如我在 CharStream 文档. 。因此,如果您构造一个 CharStream 从一个 System.IO.Stream 并且内容足够大,可以跨越多个 CharStream 块,您可以在完全检索输入之前开始解析。

但请注意, CharStream 将以固定(但可配置)大小的块消耗输入流,即它会调用 Read 的方法 System.IO.Stream 尽可能频繁地填充整个块。因此,如果您解析输入的速度快于检索新输入的速度,则 CharStream 即使已经有一些未解析的输入,也可能会阻塞,因为还没有足够的输入来填充完整的块。

更新

您最终问题的答案: 42.

  • 您如何实施 Stream 你从中构建 CharStream 完全取决于你。您记得的排除并行访问的限制仅适用于 CharStream 类,它不是线程安全的。

  • 实施 Stream 作为循环缓冲区可能会 限制您可以原路返回的最大距离。

  • 的块大小 CharStream 影响您可以回溯的程度 Stream 不支持查找。

  • 异步解析输入的最简单方法是在异步任务中进行解析(即在后台线程上)。在任务中,您可以简单地同步读取套接字,或者,如果您不信任操作系统的缓冲,您可以使用流类,例如 BlockingStream 您在下面第二条评论中链接的文章中进行了描述。

  • 如果输入可以很容易地分成独立的块(例如对于基于行的文本格式),自己将其分块然后逐块解析输入块可能会更有效。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top