题
是否可以像从套接字一样以块的形式向 FParsec 解析器提交输入?如果没有,是否可以检索输入流的当前结果和未解析部分,以便我可以完成此任务?我正在尝试运行来自的输入块 SocketAsyncEventArgs
无需缓冲整个消息。
更新
注意到使用的原因 SocketAsyncEventArgs
表示将数据发送到 CharStream
可能会导致对底层的异步访问 Stream
. 。具体来说,我正在考虑使用循环缓冲区来推送来自套接字的数据。我记得 FParsec 文档指出底层 Stream
不应该异步访问,所以我计划手动控制分块解析。
最终问题:
- 我可以在我的下使用循环缓冲区吗
Stream
传递给CharStream
? - 在这种情况下我不需要担心手动控制分块吗?
解决方案
FParsec 的普通版本(尽管不是 低信任版本)按块或“按块”读取输入,正如我在 CharStream
文档. 。因此,如果您构造一个 CharStream
从一个 System.IO.Stream
并且内容足够大,可以跨越多个 CharStream
块,您可以在完全检索输入之前开始解析。
但请注意, CharStream
将以固定(但可配置)大小的块消耗输入流,即它会调用 Read
的方法 System.IO.Stream
尽可能频繁地填充整个块。因此,如果您解析输入的速度快于检索新输入的速度,则 CharStream
即使已经有一些未解析的输入,也可能会阻塞,因为还没有足够的输入来填充完整的块。
更新
您最终问题的答案: 42.
您如何实施
Stream
你从中构建CharStream
完全取决于你。您记得的排除并行访问的限制仅适用于CharStream
类,它不是线程安全的。实施
Stream
作为循环缓冲区可能会 限制您可以原路返回的最大距离。的块大小
CharStream
影响您可以回溯的程度Stream
不支持查找。异步解析输入的最简单方法是在异步任务中进行解析(即在后台线程上)。在任务中,您可以简单地同步读取套接字,或者,如果您不信任操作系统的缓冲,您可以使用流类,例如
BlockingStream
您在下面第二条评论中链接的文章中进行了描述。如果输入可以很容易地分成独立的块(例如对于基于行的文本格式),自己将其分块然后逐块解析输入块可能会更有效。