Artykuł ten jest częścią serii artykułów na temat Programowania reaktywnego.
Zapraszam na GitHub-a.
Tematy
- Wstęp
- Zabawa z czasem - Timer
- Kto za tym stoi? - Scheduler
- Nie zapominaj - Subscribe
- Zabawa z czasem - Interval
- Zabawa z czasem - Buffer
- Zabawa z czasem - Delay
- Zabawa z czasem - Sample
- Zabawa z czasem - Throttle
- Zabawa z czasem - Timestamp/TimeInterval
- Tworzymy dane - Generators
- Tworzymy dane - Własna klasa publikująca
- Marudzimy - Skip
- Marudzimy - Take
- Łap To! - ConsoleKey
- Kombinatorzy - Concat
- Kombinatorzy - Repeat
- Kombinatorzy - Start With
- Kombinatorzy - Ambiguous
- Kombinatorzy - Merge
- Kombinatorzy - Zip
- Kombinatorzy - Switch
- Kombinatorzy - When-And-Then
- Kombinatorzy - Combine Latest
- Transformers - Select
- Transformers - OfType and Cast
- Transformers - Metadata
- Bileciki do kontroli - Unit Tests of Interval
- Bileciki do kontroli - Unit Tests of Observer Interval
- Bileciki do kontroli - Unit Tests of Create Cold/Hot Observable
- Szpryca - AutoFac
Wstęp
Tak to już koniec tej mini serii o kombinatorach. Wyszło dziewięć postów. Całkiem sporo.
Wszystkie kody oczywiście znajdują się na GitHub-ie. Myślę, że w ten sposób łatwiej będzie zrozumieć działanie Rx-ów. Uruchomić i analizować co tam się ciekawego dzieje. A jeszcze lepiej poeksperymentować.
Observable.CombineLatest
Dziwny ten kombinator, jak już zostanie odblokowany przez otrzymanie przynajmniej po jednej porcji danych od głównych źródełek. To wówczas już publikuje w raz z taktem najszybszego dystrybutora. Jak nie ma od innych danych. To powiela ostatnią porcyjkę.
Bazując na przykładzie dotyczącym When-And-Then powstał poniższy kodzik. Dzięki użyciu strumienia ConsoleKey nic się ciekawego nie dzieje puki nie wciśniemy różnego od Enter klawisza na klawiaturze.
Wduszenie spowoduje odblokowanie i popłynie strumień danych.
Łącznikiem wszystkich nadrzędnych źródełek jest tutaj CombineLatest. Można mu podać wiele strumieni w parametrach. Jednak trzeba pamiętać, że ilość parametrów powinna być odzwierciedlona w takiej samej ilości także parametrów w lambdzie znajdującej się na końcu użycia CombineLatest.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var observableStream1 = GeneratorFactory.CreateGenerator(0, 100, 1, 500);
var observableStream2 = GeneratorFactory.CreateGenerator(1000, 1100, 1, 2000);
var observableStream3 = GeneratorFactory.CreateGenerator(10000, 11000, 1, 250);
var observableProvider = new ObservableProvider();
observableProvider.ConsoleKey.BreakWhenKey(ConsoleKey.Enter);
var combineLatestStream = observableStream1.CombineLatest(
observableStream2,
observableStream3,
observableProvider.ConsoleKey,
(a, b, c, d) => new
{
A = a,
B = b,
C = c,
D = d.Key
});
var combineLatestSubscribent = combineLatestStream.DefaultPrint("CombineLatest");
Wykorzystujemy dane od wszystkich strumieni i tworzymy nowy obiekt.
Znaczy to tyle, że raz odblokowany strumień, płynie już nieustannie powielając mniej aktualne dane.
Wszyscy maszerują razem…
Zakończenie
Kończąc przygodę z kombinowaniem zastanawiam się jaką tematykę podjąć dalej. Jeszcze wcale nie było słowa na temat przechwytywania zdarzeń. Zastępując tym samym użycie +/-= new EventHandler….
Ale o tym głębiej będę się zastanawiał jutro. Dzisiaj dziękuję za poświęcony czas.
Kod z Wami!
Jest to post wchodzący w skład podjętego wyzwania ogłoszonego przez MIROBURN we vlogu z dnia 3 lutego 2018 roku.
Celem wyzwania jest systematyczne działanie w ciągu 30 dni.
Postanowiłem pisać post dziennie o tematyce Programowania Reaktywnego dla platformy .NET.
Wszelkie źródła związane z postami znajdują się na repozytorium GitHub.
Stan obecny wyzwania: 30 z 30 dni.
Referencje:
- MSDN - Getting Started with Rx,
- MSDN - Reactive Extensions,
- 101 Rx Samples,
- ReactiveX,
- Code Project,
- GitHub
Wcześniejszy: Programowanie Reaktywne - Kombinatorzy - When-And-Then
Następny: Programowanie Reaktywne - Transformers - Select