2017-07-19 2 views
3

Ich bin eine Anwendung mit TPL-Datenfluss erstellen. Eigentlich habe ich folgendes Problem. Ich habe einen Transformblock . So empfängt tfb1 on in Nachricht und erstellt eine Liste von out-Nachrichten. Diese Liste von Aus-Nachrichten soll mit einem Router-Datenblock verknüpft sein, der OutMsg als Eingabe empfängt (und nicht IReadOnlyCollection<OutMsg>).TPL Dataflow: Flachen eingehende Sammlung auf Sequentiell Artikel

Wie kann ich die IReadOnlyCollection abflachen, so dass die enthaltene Nachricht als Eingabe für z.B. ein Transformationsblock in Form von TransformBlock<OutMsg, SomeOtherType>. Ist es möglich über LinkTo()?

Thx

+0

Haben Sie TransformManyBlock versucht? –

+0

Ich dachte, TransformMany ist eine 1 zu n Beziehung. Also 1 Nachricht erstellt eine Sammlung von Nachrichten. – Moerwald

+0

Wollen Sie das nicht hier? Produzieren Sie mehrere OutMsg-Objekte und übergeben Sie sie an den Router-Block? –

Antwort

2

Sie die TransformManyBlockTransformMany statt verwenden können jede IEnumerable<T> Ergebnis, zB zu glätten:

var flattenBlock = new TransformManyBlock<InMsg,OutMsg>(msg=>{ 
    List<OutMsg> myResultList; 
    //Calculate some results 
    return myResultList; 
}); 

Dies wird einzelne OutMsg Instanzen zum nächsten Block übergeben.

Sie einen Iterator verwenden können so einzelne Nachrichten immediatelly propagiert werden:

Oder Sie die Eingabe nur abflachen:

var flattenBlock = new TransformManyBlock<IEnumerable<OutMsg>,OutMsg>(items=>items); 

Sie diesen Block in jedem Block verknüpfen können, die OutMsg akzeptiert:

var block = new ActionBlock<OutMsg>(...); 

flattenBlock.LinkTo(block); 

Sie können Route Nachrichten, indem ein Prädikat an LinkTo übergeben wird. Zum Beispiel, wenn Sie Route Fehlermeldungen an einen Protokollierungs blockieren möchten, können Sie Folgendes eingeben:

flattenBlock.LinkTo(logBlock,msg=>msg.HasError); 
flattenBlock.LinkTo(happyBlock); 

Nachrichten, die irgendein Prädikat nicht übereinstimmen wird in den Ausgabepuffer stecken und den Block von dem Abschließen verhindern. Mit einer Verbindung ohne Prädikat stellen Sie sicher, dass alle Nachrichten verarbeitet werden

+0

Hmm ... aber der obige Code erzeugt eine Liste von Ausgabenachrichten aus einer Eingabenachricht. Ich würde die entgegengesetzte Operation benötigen. – Moerwald

+0

Sie haben angegeben, dass Sie die Liste * reduzieren * und einzelne Nachrichten an einen Routerblock senden möchten. BTW Sie können ein Prädikat für 'LinkTo()' angeben, Sie benötigen keinen Block zum Weiterleiten von Nachrichten –

+0

Richtig. Vielen Dank für Ihre aktualisierte Antwort, ich werde Ihren Vorschlag versuchen. – Moerwald

Verwandte Themen