1

Je suis toujours en train de faire un coup de TPL DataFlow alors supportez-moi.Est-ce qu'un lien ActionBlock vers un autre ActionBlock peut contenir plus de paramètres?

Mon application nécessite que la file d'attente soit exécutée en parallèle tout en conservant son ordre. Cela m'a conduit à la bibliothèque DataFlow et à ce que j'essaie de faire. Je me demande s'il existe un moyen de lier un ActionBlock à un autre et si le second prend une valeur du premier à fonctionner.
pseudo-exemple:

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? 

Est-ce que je suis en train de faire possible? Cela a-t-il même un sens? La raison pour laquelle j'ai ces séparés en deux ActionBlocks est que je voudrais réutiliser block2 dans un autre chemin de code (hacher différemment le contenu d'un différent ByteBuffer.)

Peut-être qu'il y a un meilleur moyen? Vraiment, je suis juste en train d'essayer de hacher les objets comme ils arrivent simultanément tout en conservant l'ordre du FIFO car c'est trop lent pour les hacher de manière synchrone.

+0

Avez-vous envisagé d'utiliser Rx - Microsoft Reactive Framework? (NuGet "System.Reactive") – Enigmativity

Répondre

2

Il suffit d'utiliser le 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? 

Ou, l'option sans doute préférable d'utiliser une classe DTO avec deux propriétés: tampon et hachage, comme Tuple est pas beaucoup lisible. En outre, considérez une nouvelle fonctionnalité C# sur les tuples nommés.

+0

Semble si évident maintenant! Je vous remercie. –