Sagen wir, ich möchte nicht blockierende Lesevorgänge von einem Netzwerk-Socket tun. Ich kann async warten auf den Socket zu lesen x Bytes und alles ist in Ordnung.Wie macht man nicht blockiert Socket liest mit Protobuf mit C#?
Aber wie kombiniere ich das mit Deserialisierung über Protobuf?
Lesen von Objekten aus einem Stream muss blockieren? Das heißt, wenn der Stream zu wenig Daten für den Parser enthält, muss hinter den Kulissen blockiert werden, damit der Leser alle benötigten Bytes abrufen kann.
Ich denke, ich kann Länge Prefix Trennzeichen verwenden und die ersten Bytes lesen und dann herausfinden, wie viele Bytes ich Minimum holen muss, bevor ich analysieren, ist das der richtige Weg? z.B. Wenn mein Puffer 500 Bytes ist, dann erwarte diese 500 Bytes, und analysiere die Länge Präfix, und wenn die Länge mehr als 500 ist, dann warte wieder, bis alles gelesen ist.
Was ist die idiomatische Möglichkeit, nicht blockierende IO- und Protobuf-Parsing zu kombinieren?
(Ich bin mit Jon Skeet Implementierung jetzt http://code.google.com/p/protobuf-csharp-port/)
Können Sie mehr darüber erfahren, was so schwer daran ist? Ersetzen Sie nicht jedes 'Read()' mit 'award ReadAsync()' genug? – svick
@svick zuerst, bemerkte ich "effizient". Deserialisierung ist oft eine Vielzahl von einzelnen einfachen Operationen. Es ist unangemessen, für jede eine Aufgabe zu erstellen. Zweitens: Viele Serialisierer verwenden Meta-Programmierung, was bedeutet, dass der generierte Code dies auch implementieren muss - und beachte, dass Meta-Programmierung nicht immer "erzeugt C# bedeutet, das dem Compiler zugeführt wird". Wenn Sie alles tun müssten, was "erwarten" würde, manuell, in IL - könnten Sie einfach verrückt werden. Crazier, in meinem Fall. –