TPL Dataflows – część VI (JoinBlock)

W poprzednim wpisie pisałem o pierwszym bloku grupującym – BatchBlock. Dziś czas przyszedł na kolejny element, tym razem JoinBlock. JoinBlock grupuje elementy podane na wejście w formie Tuple (pisałem o tej klasie kiedyś na blogu). Jeśli zatem podamy na wejście dwa integer’y, na wyjściu pojawi się Tuple<int,int>.

Tak samo jak BatchBlock, JoinBlock działa w dwóch trybach – greedy oraz non-greedy. Zasada jest taka sama – zachęcam do przeczytania poprzedniego postu. W skrócie, w trybie zachłannym wszystkie wiadomości są akceptowane od razu, z kolei w niezachłannym są one “odraczane” co może umożliwić innym blokom ich użycie. Za kilka postów planuje napisać jakiś przykład pokazujący tą różnicę.

W przeciwieństwie do poprzednich elementów, JoinBlock nie implementuje interfejsu ITargetBlock a eksponuje właściwości Target1, Target2, które z  kolei implementują ITargetBlock. Przejdźmy więc do przykładu:

class Program
{
   private static void Main(string[] args)
   {
       var joinBlock = new JoinBlock<string, int>();
       joinBlock.LinkTo(new ActionBlock<Tuple<string, 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<string,int> data)
   {
       Console.WriteLine(data);
   }
}

Na ekranie najpierw wyświetli się (Klucz,5), potem (Klucz 2,6), a na końcu JoinBlock będzie czekał na wartość integer aby połączyć ją z Klucz3.

Leave a Reply

Your email address will not be published.