Mit der Einführung von Asynchron/await, so lange einige Kontext
gefunden bieten als Alle bis auf eine Ihrer Leseaufgaben sind asynchron. Sie sollten dieselben Daten zweimal mit nur einem einzelnen Betriebssystem-Thread verarbeiten können.
Was ich denke, Sie wollen, ist eine verknüpfte Liste der Datenblöcke, die Sie bisher gesehen haben. Dann können Sie mehrere benutzerdefinierte Stream-Instanzen haben, die einen Zeiger in diese Liste enthalten. Wenn Blöcke vom Ende der Liste fallen, werden sie als Müll gesammelt. Die sofortige Wiederverwendung des Speichers würde eine andere Art von Umlauflisten- und Referenzzählung erfordern. Machbar, aber komplizierter.
Wenn Ihr angepasster Stream einen ReadAsync-Aufruf aus dem Cache beantworten kann, kopieren Sie die Daten, verschieben Sie den Zeiger in der Liste nach unten und kehren Sie zurück.
Wenn Ihr Stream das Ende der Cache-Liste erreicht hat, möchten Sie ein einzelnes ReadAsync für den zugrunde liegenden Stream ausgeben, ohne darauf zu warten und die zurückgegebene Aufgabe mit dem Datenblock zwischenzuspeichern. Wenn also ein anderer Stream-Reader ebenfalls aufholt und versucht, mehr zu lesen, bevor dieser Lesevorgang abgeschlossen ist, können Sie dasselbe Task-Objekt zurückgeben.
Auf diese Weise haken beide Leser ihre Wartefortsetzung auf das Ergebnis des gleichen ReadAsync-Aufrufs. Wenn der einzelne Lesevorgang zurückkehrt, führen beide Lesevorgänge den nächsten Schritt ihres Prozesses sequenziell aus.
So etwas wie 'tee' in UNIX ... –
Es wahrscheinlich um einen Ringpuffer basiert werden müssen. Ich werde versuchen, eine schnelle Implementierung zu schreiben, wenn ich Zeit bekomme. – Noldorin