stream de données tpl: taille de mémoire tampon fixe sans jeter d’éléments

Après avoir joué avec dataflow, j’ai rencontré un nouveau problème. Je voudrais limiter la file d’entrée en entrée de tous les blocs. Mon bloc de production (ActionBlock) crée 5000 éléments très rapidement et les publie dans un broadcastblock. Donc, si je règle 100 sur BoundedCapacity du broadcastblock, il jette beaucoup de données. Mais je préférerais que le blocage de production produise de nouveaux créneaux dans la file d’entrée de mon tampon.

Y at-il un moyen de se débarrasser de ce problème?

C’est exactement ce à BufferBlock sert BufferBlock . Si vous définissez sa BoundedCapacity et que celle-ci se BoundedCapacity , la réception des messages est différée jusqu’à ce que quelqu’un les consum. Cela signifie par exemple que Post() bloquera et SendAsync() renverra une Task non terminée.

EDIT: Il n’existe aucun bloc intégré qui envoie à plusieurs cibles et ne jette jamais de données. Mais vous pouvez facilement en construire un vous-même à partir d’ ActionBlock et de la boucle d’envoi:

 static ITargetBlock CreateMultipleTargetsBlock( IEnumerable> targets, int boundedCapacity) { var targetsList = targets.ToList(); var block = new ActionBlock( async item => { foreach (var target in targetsList) { await target.SendAsync(item); } }, new ExecutionDataflowBlockOptions { BoundedCapacity = boundedCapacity }); // TODO: propagate completion from block to targets return block; } 

Ce code suppose que vous n’avez pas besoin de cloner les données pour chaque cible et que la liste des cibles ne change jamais. Modifier le code pour cela devrait être assez simple.