IEnumerable und sequenzielle Verarbeitung

83 views
Skip to first unread message

Eugen Berenstein

unread,
Aug 10, 2012, 8:55:26 AM8/10/12
to event-based...@googlegroups.com

Hallo liebe FD-ler,

Ich bin neu mit FlowDesign eingestiegen und finde es sehr gut. Ich habe aber eine Frage, die mich nicht loslässt. Ralf hat vorgeschlagen als Ausgabe von FEs, die mehrere Werte liefern IEnumerable zu verwenden, damit der Empfänger weiß, wann die Daten zu Ende sind. Diesen Ansatz finde ich sehr sauber und gut. Allerdings habe ich folgendes Problem:

Angenommen, die Daten sollen durch eine sequenzielle FE weiterverarbeitet werden (d.h. sie kann die Daten nur einzeln entgegennehmen) und danach den Nachfolgern wieder als IEnumerable zur Verfügung gestellt werden. Es würde jetzt also zwischen dem „Ziehen“ der Daten aus dem IEnumerable zum „Drücken“ der Daten durch die sequenzielle FE und wieder zum „Ziehen“ der Daten durch die Nachfolger gewechselt werden.

Mir fallen da zwei Lösungsansätze ein:

  1. Einsammeln der Daten und Senden des IEnumerable wenn das Ende erreicht ist.
  2. Senden des IEnumerable beim Eintreffen des Ersten Datums und Blockieren des MoveNext() Aufrufs, bis ein weiteres Datum zur Verfügung steht.

Bild 1 zeigt einen möglichen Flow.

Ansatz 1 ist einfach, blockiert aber den Flow und sammelt Daten im Speicher an. Das finde ich nicht akzeptabel.
Ansatz 2 erfordert (IMHO) dass der Empfänger auf einem anderen Thread ausgeführt wird, da es durch die Blockierung ansonsten zu einem Deadlock kommt. Das zu erzwingen gefällt mir auch nicht.

Als Workaround habe ich momentan einen Flow wie im Bild 2. Transformieren ist dabei eine FE, die die Daten sequenziell durch einen Nebenflow schickt und auf die Rückgabe wartet. Das geschieht erst, wenn der Nachfolger MoveNext() aufruft. Das umgeht die oben genannten Nachteile, führt aber zu einem komplizierten Flow.

Vielleicht verstehe ich das ganze falsch oder ihr könnt mir eine bessere Lösung empfehlen? Ich wäre für jeden Input sehr dankbar.

lg, Eugen

Stefan Lieser

unread,
Aug 11, 2012, 2:01:59 AM8/11/12
to event-based...@googlegroups.com
Hallo Eugen,

schau mal in das ebclang Projekt. Dort gibt es FEs mit denen du zwischen den beiden Varianten hin und her wechseln kannst. Und ja, es wird dann asynchron. 


Viele Grüße
Stefan Lieser
--

Ralf Westphal

unread,
Aug 11, 2012, 9:42:48 AM8/11/12
to event-based...@googlegroups.com
Wie Stefan schon gesagt hat: Im ebclang Projekt gibt es zwei Patterns zum Thema:

ToEnumerable

ToStream

Streams sind einzelne Datenpakete bis zu einem Ende-Paket (null).

Sequenzen von Daten als IEnum oder Stream weiterzugeben, hat Vor- und Nachteile.

Vorteil IEnum: Das ist kompakt, einfach zu generieren auf verschiedene Weisen, ein Ende ist implizit.
Nachteil: Entweder werden Daten in-mem angehäuft (wenn IEnum ein Array oder eine IList ist), oder es wird die tatsächliche Datenbeschaffung verzögert, bis jmd an den Daten zieht. Das ist z.B. in async Szenarien unschön.

Vorteil Stream: Verarbeitungsschritte konzentrieren sich auf je nur 1 Datenpaket. Verarbeitung kann sehr schön in async oder gar parallel Schritten durchgeführt werden.
Nachteil: Es muss das Streamende mit einem ausgewiesenen Datenpaket (EndOfStream) gekennzeichnet werden.

--
Ralf Westphal - One Man Think Tank
Hans-Henny-Jahnn-Weg 44
D-22085 Hamburg
Germany
Tel 0170-3200458
Email in...@ralfw.de

Eugen Berenstein

unread,
Aug 13, 2012, 3:31:22 AM8/13/12
to event-based...@googlegroups.com
Hallo Ralf und Stefan,

ich entwickle in Java und da ist es sehr viel umständlicher ein IEnumerable zu generieren als in C#.
Aus diesem Grund und wegen anderen Problemen werde ich es wohl mit Streams und EndOfStream Paketen versuchen.

Vielen Dank für eure Hilfe und die Erläuterungen.
Reply all
Reply to author
Forward
0 new messages