PipeWriter 和长度前缀消息

问题描述

我正在尝试使用以字节长度为前缀的 PipeWriter 编写二进制消息。 在整个消息完成之前,我不知道字节长度。 这完全可以用 PipeWriter 完成吗?

基本上我正在尝试实现这三种方法

void StartMessage(PipeWriter writer)
{
    // leave 4 empty bytes for length written at later time
    this.header_ = writer.GetMemory(4);
    
    writer.Advance(4);
}

void Write(PipeWriter writer,ReadOnlySpan<byte> span)
{
    var buffer = writer.GetSpan(span.Length);

    span.copyTo(buffer);

    writer.Advance(span.Length);

    this.totalLength_ += span.Length;
}

ValueTask EndMessage(PipeWriter writer)
{
    // should prepend this.totalLength_ to the message
    BinaryPrimities.WriteUInt32BingEndian(this.header_.Span,this.totalLength_);

    // signal end of message
    return writer.FlushAsync();
}

这给了我预期的结果,但 PipeWrite.Advance 的文档指出:

必须在调用 system.io.pipelines.PipeWriter.Advance(system.int32) 后请求新的缓冲区才能继续写入更多数据;您不能写入先前获得的缓冲区。

使用 PipeReaderAdvanceto(consumed,examined) 方法可以轻松读取此类消息,其中我们仅在整个消息长度可用时才使用输入,但我一直无法想出 {{1 }} 根据文档正确的用法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)