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.