TPL Dataflows – część VII (BatchedJoinBlock)

W ostatnich postach pisałem o JoinBlock oraz BatchedBlock czyli o blokach grupujących.  Dzisiaj czas na połączenie tych dwóch konstrukcji, a mianowicie BatchedJoinBlock. Jak sama nazwa sugeruje, block będzie łączył elementy z kilku źródeł w Tuple ale zamiast Tuple<T> (czysty Join) będzie to Tuple<IList<T>> czyli elementy będą dodatkowo buforowane. Zmodyfikujmy ostatni przykład:

internal class Program
{
   private static void Main(string[] args)
   {
       var joinBlock = new BatchedJoinBlock<string, int>(3);
       joinBlock.LinkTo(new ActionBlock<Tuple<IList<string>, IList<int>>>(data => Display(data)));

       joinBlock.Target1.Post("Klucz");
       joinBlock.Target1.Post("Klucz 2");
       joinBlock.Target2.Post(5);
       joinBlock.Target2.Post(6);
       joinBlock.Target1.Post("Klucz 3");

       Console.ReadLine();
   }

   private static void Display(Tuple<IList<string>, IList<int>> data)
   {
       foreach (string key in data.Item1)
           Console.WriteLine(key);

       foreach (int value in data.Item2)
           Console.WriteLine(value);
   }
}

Na ekranie wyświetli się:

image

Dlaczego? Określiliśmy rozmiar porcji na 3 elementy. Pierwszym elementem jest “Klucz”, drugim “Klucz2” a ostatnim 5. Przekazany rozmiar w konstruktorze zatem określa liczbę wszystkich właściwości Tuple.

Myślę, że taki krótki opis wystarczy. Jeśli ktoś rozumie BatchedBlock oraz JoinBlock (opisane w poprzednich postach) z pewnością zrozumie BatchedJoinBlock – po prostu blok zwraca Tuple<IList<T>…>.

W kolejnym wpisie postaram się już o jakiś sensowniejszy przykład z użyciem grupujących bloków.

Leave a Reply

Your email address will not be published.