簡體   English   中英

如何使用C#使用Protobuf進行非阻塞套接字讀取?

[英]How to do non blocking socket reads with Protobuf using C#?

假設我想從網絡套接字執行非阻塞讀取。 我可以異步等待套接字讀取x字節,一切都很好。

但是如何通過protobuf將其與反序列化相結合?

從流中讀取對象必須阻塞? 也就是說,如果流包含的解析器數據太少,那么必須在后台進行一些阻塞,以便讀者可以獲取所需的所有字節。

我想我可以使用lengthprefix分隔符並讀取第一個字節,然后計算出在解析之前我必須獲取最少的字節數,這是正確的方法嗎? 例如,如果我的緩沖區是500字節,則等待那500個字節,並解析長度前綴,如果長度超過500,則再次等待,直到讀取所有內容。

結合非阻塞IO和protobuf解析的慣用方法是什么?

(我現在正在使用Jon Skeet的實現http://code.google.com/p/protobuf-csharp-port/

作為一般規則,序列化程序通常不包含DeserializeAsync方法,因為這真的很難(至少,有效)。 如果數據大小適中,那么我建議使用異步代碼緩沖所需的數據量 - 然后在所有必需數據可用時進行反序列化。 如果數據非常大並且您不希望緩沖內存中的所有內容,那么請考慮在工作線程上使用常規同步反序列化。

(請注意,這是特定於實現的,但如果您使用的序列化程序確實支持異步反序列化:那么確定,使用它)

使用BeginReceive/EndRecieve()方法將數據接收到字節緩沖區(通常為1024或2048字節)。 AsyncCallback ,確保您沒有讀取-1/0字節(流結束/ disconnect / io錯誤)后,嘗試使用ProtocolBuf反序列化數據包。

您的接收回調將是異步的,並且在與讀取相同的線程中解析數據包是有意義的,恕我直言。 這種處理可能會帶來最大的性能損失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM