1

Ich bekomme immer noch einen Hang von TPL DataFlow, also ertragen Sie mit mir.Kann ein ActionBlock mit einem anderen ActionBlock mit mehr Parametern verknüpft werden?

Meine Anwendung erfordert, dass die Warteschlange parallel ausgeführt wird, während ihre Reihenfolge beibehalten wird. Dies führte mich zur DataFlow-Bibliothek und was ich versuche zu tun. Ich frage mich, ob es einen Weg gibt, einen ActionBlock mit einem anderen zu verknüpfen, und der zweite einen Wert von dem ersten übernimmt, um weiter zu arbeiten.
Pseudo-Beispiel:

var block1 = new ActionBlock<ByteBuffer>(buffer => { 
    // code generating a hash of the byte buffer to pass to next block 
    ulong hash = generateHash(buffer); 
    // this is what i would like to pass to the next ActionBlock 
    var tup = Tuple<ByteBuffer, ulong>(buffer, along); 
}, dataFlowOpts); 
var block2 = new ActionBlock<Tuple<ByteBuffer, ulong>(tup => { 
    /* code to act on the buffer and hash */ 
}, dataFlowOpts); 

block1.LinkTo(block2); // Is there something like this that would use the correct params? 

Ist das, was ich versuche möglich zu tun? Macht das überhaupt Sinn? Der Grund, warum ich diese in zwei ActionBlocks getrennt habe, ist, dass ich Block2 in einem anderen Codepath wiederverwenden möchte (Hashing der Inhalt eines anderen ByteBuffer anders.)

Vielleicht gibt es einen besseren Weg? Wirklich, ich versuche nur, Objekte gleichzeitig zu hashen, während sie die FIFO-Reihenfolge beibehalten, da es viel zu langsam ist, um diese synchron zu hashen.

+0

Haben Sie sich mit Rx - Microsofts Reactive Framework - beschäftigt? (NuGet "System.Reactive") – Enigmativity

Antwort

2

Sie werden die TransformBlock:

var block1 = new TransformBlock<ByteBuffer, Tuple<ByteBuffer, ulong>>(buffer => { 
    // code generating a hash of the byte buffer to pass to next block 
    ulong hash = generateHash(buffer); 
    // this is what i would like to pass to the next ActionBlock 
    return Tuple<ByteBuffer, ulong>(buffer, along); 
}, dataFlowOpts); 
var block2 = new ActionBlock<Tuple<ByteBuffer, ulong>(tup => { 
    /* code to act on the buffer and hash */ 
}, dataFlowOpts); 

block1.LinkTo(block2); // Is there something like this that would use the correct params? 

Oder wahrscheinlich bessere Option eine DTO-Klasse mit zwei Eigenschaften verwenden: Puffer und Hash, wie Tuple nicht viel lesbar ist. Beachten Sie auch eine neue C# -Funktion über benannte Tupel.

+0

Scheint so offensichtlich jetzt! Vielen Dank. –

Verwandte Themen