Bevorzugte Methode zum Generieren eines IObservableString aus einem Stream

8

Als Teil unserer Anwendung (seit etwa 4 Monaten in Produktion) haben wir einen Datenstrom von einem externen Gerät, das wir in ein IObservable

konvertieren

Bis jetzt haben wir das Folgende benutzt, um es zu erzeugen, und es hat ziemlich gut funktioniert.

%Vor%

Gestern Abend habe ich mich gefragt, ob es eine Möglichkeit gibt, die yield return -Syntax zu verwenden, um das gleiche Ergebnis zu erzielen, und habe folgendes herausgefunden:

%Vor%

Es scheint ganz gut zu funktionieren und es ist viel sauberer, aber ich habe mich gefragt, ob es Vor- oder Nachteile für die eine oder andere Richtung gibt oder ob es einen besseren Weg gibt.

    
baralong 12.04.2012, 02:20
quelle

3 Antworten

11

Ich denke, du hast eine gute Idee (mach Stream in Enumerable, dann IObservable). Der Enumberable-Code kann jedoch viel sauberer sein:

%Vor%

Und dann das Observable:

%Vor%

Dies ist kürzer, lesbarer und entsorgt die Streams ordnungsgemäß. Es ist auch faul.

Die ToObservable-Erweiterung kümmert sich um das Abfangen der OnNext-Ereignisse (neue Zeilen) sowie des OnCompleted-Ereignisses (Ende der aufzählbaren) und OnError.

    
yamen 12.04.2012, 07:36
quelle
2

Ich habe den Code nicht zur Hand, aber hier ist, wie man es macht async pre-async CTP.

[Hinweis für Skim-Reader: keine Notwendigkeit, sich zu kümmern, wenn Sie nicht viel skalieren müssen]

Erstellen Sie eine AsyncTextReader-Implementierung, die selbst Observable ist. Der ctor nimmt einen Stream auf und führt eine BeginRead-Operation (256 Bytes) im Stream aus, wobei er sich selbst als Fortsetzung weitergibt und dann zurückkehrt.

Wenn die Fortsetzung aufgerufen wird, rufen Sie EndRead auf und fügen Sie die zurückgegebenen Bytes in einen kleinen Puffer für die Klasse ein. Wiederholen Sie dies, bis der Puffer eine oder mehrere Zeilenende-Sequenzen enthält (gemäß TextWriter). Wenn dies der Fall ist, senden Sie diese Bits des Puffers über die Observable-Schnittstelle als Zeichenfolge aus und wiederholen Sie den Vorgang.

Wenn Sie fertig sind, melden Sie OnComplete usw. (und entsorgen Sie den Stream). Wenn Sie in Ihrer Fortsetzung eine Ausnahme vom EndReadByte erhalten, fangen Sie sie ab und übergeben Sie sie an die OnError-Schnittstelle.

Aufrufcode sieht dann wie folgt aus:

  

IObservable = new AsyncTextReader (stream);

Das ist gut skalierbar. Sie müssen nur sicherstellen, dass Sie mit der Pufferbehandlung nichts zu dumm machen.

Pseudocode:

%Vor%

Ok, das ist die APM, und etwas, das nur eine Mutter lieben kann. Ich erwarte scharf die Alternative.

ps: ob der Leser den Stream schließen soll, ist eine interessante Frage. Ich sage nein, weil es es nicht geschaffen hat.

    
piers7 13.04.2012 15:29
quelle
0

Mit async / await support ist das Folgende wahrscheinlich die beste Wahl:

%Vor%     
Lukazoid 16.11.2015 14:02
quelle