Wie kann ich die split (Kopie) in einem Stream .NET?
Weiß jemand, wo finde ich einen Stream splitter Umsetzung?
Ich bin auf der Suche nach nehmen Sie einen Stream und erhalten zwei getrennte streams, die unabhängig voneinander gelesen und geschlossen werden, ohne Beeinträchtigung der jeweils anderen. Diese streams sollte jeder wieder den gleichen Binär-Daten, dass die original Bach würde. Keine Notwendigkeit zu implementieren, Position oder Seek und so... nur Vorwärts.
Ich würde es bevorzugen, wenn es nicht einfach kopieren Sie den gesamten Strom in den Speicher und servieren es mehrere Male, das wäre ziemlich einfach zu implementieren, mich.
Gibt es etwas da draußen, die dies tun könnte?
- So etwas wie
tee
im UNIX... - Es wird wohl sein müssen, um einen Ringpuffer. Ich werde versuchen, zu schreiben, eine schnelle Umsetzung, wenn ich die Zeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht out of the box.
Müssen Sie Puffern die Daten aus der original Bach in einer FIFO-Weise, wobei nur die Daten, die gelesen wurde, die alle "Leser" - streams.
Ich würde verwenden:
Dies könnte schwierig sein, ohne zu riskieren, halten alles im Speicher gepuffert werden (wenn die streams sind BOF und EOF bezeichnet).
Frage ich mich, ob es nicht einfacher zu schreiben, den stream auf die Festplatte kopieren, und habe zwei streams Lesen von der Festplatte, mit self-löschen-gebaut in den
Close()
(d.h. schreiben Sie Ihre eigenenStream
wrapperFileStream
).Kann man nicht wirklich, dies zu tun, ohne zu duplizieren, zumindest einen Teil der Quelle-stream - vor allem aufgrund der Tatsache, dass, wenn nicht klingen wie Sie können Steuern, die Geschwindigkeit, mit der Sie konsumiert werden (mehrere threads?). Sie konnte etwas tun, klug bezüglich einer Lesung ahread des anderen (und damit die Kopie an dieser Stelle nur), aber die complexiy das klingt, es ist nicht der Mühe Wert.
Den unten gültig zu sein scheint, genannt EchoStream
http://www.codeproject.com/Articles/3922/EchoStream-An-Echo-Tee-Stream-for-NET
Es ist eine sehr alte Implementierung (2003) sollte aber einigen Kontext
gefunden über Umleiten in eine Datei schreibt, um eine stream-C#
Ich glaube nicht, dass Sie in der Lage sein zu finden, eine generische Implementierung zu tun. Ein Stream ist eher Abstrakt, Sie wissen nicht, wo die bytes herkommen. Zum Beispiel wissen Sie nicht, ob es unterstützt wird auf der Suche, und Sie nicht wissen, die relativen Kosten von Operationen. (Der Stream könnte eine Abstraktion, die für das Lesen von Daten von einem remote-server, oder auch aus einem backup-Band !).
Wenn Sie sind in der Lage, einen MemoryStream und speichern Sie die Inhalte einmal erstellen, können Sie zwei getrennte streams mit dem gleichen Puffer; und Sie Verhalten sich wie unabhängige Streams aber nur den Speicher verwenden, der einmal.
Ansonsten finde ich sind Sie am besten aus durch die Erstellung einer wrapper-Klasse, die speichert die gelesenen bytes aus einem stream, bis Sie auch Lesen, indem der zweite Strom. Geben Sie die gewünschte vorwärts-nur Verhaltens -, sondern im schlimmsten Fall könnten Sie Gefahr, die Speicherung der bytes im Speicher, wenn der zweite Strom ist nicht zu Lesen, bis der erste Strom abgeschlossen hat, Lesen den gesamten Inhalt.
Ich habe einen SplitStream verfügbar auf github und NuGet.
Geht es so.
Habe ich nicht getestet, bei sehr großen strömen, aber versuchen Sie es.
github: https://github.com/microknights/SplitStream
Mit der Einführung von async /await, so lange, wie Sie alle Ihre leseaufgaben sind async, sollten Sie in der Lage, die gleichen Daten zweimal mit nur einem einzigen Betriebssystem-thread.
Was ich denke, Sie wollen, ist eine verknüpfte Liste von Datenblöcken, die Sie bisher gesehen haben. Dann können Sie mehrere benutzerdefinierte Stream-Instanzen, die einen Zeiger in diese Liste. Als Blöcke fallen aus dem Ende der Liste, werden Sie von der garbage Collection eingesammelt. Wiederverwendung der Speicher sofort benötigen würde, eine andere Art von kreisförmigen Liste und reference counting. Machbar, aber komplizierter.
Wenn Ihre benutzerdefinierte Stream beantworten kann ein ReadAsync-Aufruf aus dem cache, die Daten kopieren, vorher die Zeiger in der Liste nach unten und zurück.
Wenn Ihr Stream erwischt hat, der bis zum Ende der cache-Liste, die Sie wollen, um eine einzige ReadAsync an die zugrunde liegenden Streams, ohne Wartezeit, und cache der zurückgegebenen Task mit den Daten blockieren. Also, wenn alle anderen Stream reader auch holt und versucht, mehr zu Lesen, bevor Sie das Lesen abgeschlossen ist, können Sie wieder die gleichen Task-Objekt.
Diese Weise sowohl Leser werden Haken Ihre erwarten die Fortsetzung zu dem Ergebnis der gleichen ReadAsync nennen. Wenn der einzelne zu Lesen gibt, sowohl Lesen, als die Aufgaben nacheinander auszuführen, den nächsten Schritt in Ihrem Prozess.