首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用C#使用Protobuf进行非阻塞套接字读取?

如何使用C#使用Protobuf进行非阻塞套接字读取?
EN

Stack Overflow用户
提问于 2014-01-20 11:22:15
回答 2查看 1.1K关注 0票数 5

让我说,我想做非阻塞从网络套接字读取。我可以异步等待套接字读取x字节,一切都很好。

但是如何通过protobuf将其与反序列化结合起来呢?

从流中读取对象一定是阻塞了吗?也就是说,如果流对解析器包含的数据太少,那么必须在幕后进行一些阻塞,以便读取器能够获取它所需的所有字节。

我想我可以使用长度前缀分隔符,读取第一个字节,然后计算出在解析之前必须获取多少字节,这是正确的方法吗?例如,如果我的缓冲区是500个字节,那么等待这500个字节,然后解析长度前缀,如果长度大于500,则再次等待,直到所有这些都被读取。

将非阻塞IO和protobuf解析结合起来的惯用方法是什么?

(我现在正在使用Jon的实现http://code.google.com/p/protobuf-csharp-port/)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-20 11:29:18

作为一般规则,序列化器通常不包含DeserializeAsync方法,因为这是确实很难做到的(至少是有效的)。如果数据是中等大小的,那么我建议使用异步代码缓冲所需的数据量,然后在所有需要的数据可用时反序列化。如果数据非常大,并且不需要缓冲内存中的所有内容,那么可以考虑在工作线程上使用常规同步反序列化。

(请注意,这是特定于实现的,但是如果您使用的序列化程序确实支持异步反序列化:那么请使用它)

票数 6
EN

Stack Overflow用户

发布于 2014-01-20 11:56:54

使用BeginReceive/EndRecieve()方法将数据接收到字节缓冲区(通常为1024字节或2048字节)。在AsyncCallback中,确保没有读取-1/0字节(流/断开/io错误结束)之后,尝试用ProtocolBuf反序列化数据包。

您的接收回调将是异步的,在读取的IMHO线程中解析数据包是有意义的。它的处理可能会导致最大的性能打击。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21232689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档