Wie kann ich mit Protobuf nicht blockierende Socket-Lesevorgänge mit C # durchführen?

Nehmen wir an, ich möchte nicht blockierende Lesevorgänge von einem Netzwerk-Socket ausführen. Ich kann asynchron darauf warten, dass der Socket x Bytes liest und alles in Ordnung ist.

Aber wie verbinde ich das mit der Deserialisierung über protobuf?

Das Lesen von Objekten aus einem Stream muss blockiert sein? Das heißt, wenn der Stream zu wenig Daten für den Parser enthält, muss hinter den Kulissen eine Blockierung stattfinden, damit der Leser alle benötigten Bytes abrufen kann.

Ich schätze, ich kann Längenpräfix-Trennzeichen verwenden und die ersten Bytes lesen und dann herausfinden, wie viele Bytes ich mindestens abrufen muss, bevor ich parse. Ist dies der richtige Weg, um dies zu tun? z.B. Wenn mein Puffer 500 Bytes hat, warten Sie auf diese 500 Bytes und analysieren Sie das Längen-Präfix. Wenn die Länge mehr als 500 ist, warten Sie erneut, bis alles gelesen ist.

Was ist die idiomatische Art, nicht blockierendes IO und Protobuf-Parsing zu kombinieren?

(Ich verwende gerade die Implementierung von Jon Skeethttp://code.google.com/p/protobuf-csharp-port/)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage