是否可以以块的形式向FParsec解析器提交输入?如果没有,是否可以检索输入流的当前结果和未解析部分,以便我可以完成此操作?我正在尝试运行来自SocketAsyncEventArgs
的大量输入而不缓冲整个消息。
更新
注意使用SocketAsyncEventArgs
的原因是表示将数据发送到CharStream
可能会导致对基础Stream
的异步访问。具体来说,我正在寻找使用循环缓冲区来推送来自套接字的数据。我记得FParsec文档指出不应该异步访问底层Stream
,所以我计划手动控制分块解析。
终极问题:
Stream
的<{1}}下的循环缓冲区吗?答案 0 :(得分:8)
正常版本的FParsec(虽然不是Low-Trust version)读取输入块,或“块状”,正如我在CharStream
documentation中所说的那样。因此,如果从CharStream
构造System.IO.Stream
并且内容足够大以跨越多个CharStream
块,则可以在完全检索输入之前开始解析。
但请注意,CharStream
将使用固定(但可配置)大小的块中的输入流,即它会像Read
那样经常调用System.IO.Stream
方法。有必要填补一个完整的块。因此,如果您以比检索新输入更快的速度解析输入,CharStream
可能会阻止,即使已经有一些未解析的输入,因为还没有足够的输入来填充整个块。
<强>更新强>
你最终问题的答案: 42。
如何实施构建Stream
的{{1}}完全取决于您。您记住的排除并行访问的限制仅适用于CharStream
类,这不是线程安全的。
将CharStream
实现为循环缓冲区可能会restrict the maximum distance over which you can backtrack.
Stream
的块大小会影响CharStream
不支持搜索时可以回溯的距离。
异步解析输入的最简单方法是在异步任务中(即在后台线程上)进行解析。在任务中,您可以简单地同步读取套接字,或者,如果您不信任操作系统的缓冲,则可以使用流式类,如下面第二条评论中链接的文章中描述的Stream
。
如果输入可以很容易地分成独立的块(例如,基于行的文本格式的行),那么自己将其分块然后按块解析输入块可能更有效。