5

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

更新

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

终极问题:

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

1 回答 1

8

FParsec 的普通版本(虽然不是Low-Trust 版本)读取输入的块方式或“块方式”,正如我在CharStream文档中所说的那样。因此,如果您CharStream从 a构造 aSystem.IO.Stream并且内容足够大以跨越多个CharStream块,您可以在完全检索输入之前开始解析。

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

更新

您最终问题的答案:42。

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

  • 将实现Stream为循环缓冲区可能会限制您可以回溯的最大距离。

  • 当不支持搜索时,块的大小会CharStream影响您可以回溯的距离。Stream

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

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

于 2012-01-17T09:48:31.187 回答