是否可以像从套接字一样以块的形式将输入提交给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
。
如果可以轻松地将输入分成独立的块(例如,基于行的文本格式的行),则将其自己进行分块,然后逐块分析输入块可能会更有效。