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
Dzisiaj ponownie poruszymy temat kombinowania na strumieniach. Tym razem posłużymy się rozszeżeniem Repeat. Jak sama nazwa wskazuję będziemy się powtarzać :). Operatory są dość proste co nie znaczy, że nie są potężnym narzędziem w całej rodzinie Rx-ów.
Repeat
Przy pomocy tego rozszerzenia możemy zaoszczędzić nieco czasu przy kodowaniu. W odniesieniu do poprzedniego posta na temat Concat i wykorzystania pętli do wygenerowania połączonej sekwencji strumieni. Dzisiaj wystarczyło wykorzystać powtarzacz z parametrem: Repeat(ile razy powtórzyć).
Dodatkowo dzisiejsze przykłady są uboższe w ilość kodu, dzięki zniwelowaniu wykorzystania zmiennej przechowującej sekwencję strumieni.
1
2
3
4
5
6
7
8
9
10
11
12
var twoSecondsTimeSpan = TimeSpan.FromSeconds(2);
var fiveSecondsTimeSpan = TimeSpan.FromSeconds(2);
var observableSequenceTenTimes =
Observable.Range(1, 5)
.Delay(fiveSecondsTimeSpan)
.Repeat(10)
.Subscribe(item =>
{
Console.WriteLine($"Only ten times: {item}");
},
exception => Console.WriteLine(exception));
Dodatkowo posłużyłem się operatorem Delay jak już wiadomo z postów dotyczących timer-owatych. Efektem będzie 5 sekundowe oczekiwanie między poszczególnymi porcjami danych od połączonych strumieni.
Drugi przypadek jest bardziej rozbudowany, i zawiera w sobie wymyślny (losowy ;)) algorytm sekwencji źródeł danych dla obserwatorów. Między poszczególnymi sekwencjami także wykorzystałem Delay.
Co tutaj jest takiego wyjątkowego? Repeat bez parametrów, czyli ciągłe powtarzanie zbudowanej sekwencji. Można to z powodzeniem wykorzystać przy sterowaniu lampkami na choince w Boże Narodzenie przy pomocy PC ;).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var observableSequenceContinually =
Observable.Range(1, 5)
.Delay(twoSecondsTimeSpan)
.Concat(CreateGenerator(100, 200, 10, 500))
.Delay(twoSecondsTimeSpan)
.Concat(Observable.Range(100, 5))
.Delay(twoSecondsTimeSpan)
.Concat(CreateGenerator(1000000, 2000000, 10000, 100))
.Delay(fiveSecondsTimeSpan)
.Repeat()
.Subscribe(item =>
{
Console.WriteLine($"Continually: {item}");
},
exception => Console.WriteLine(exception));
Ten skrócony zapis jest bardzo elegancki.
Zakończenie
Kończąc na dzisiaj wnioskiem powtarzajmy do skutku aż zapamiętamy co chcieliśmy przyswoić. Żartuję. Jednak powtarzanie zachowuje się nieco inaczej aniżeli np. Interval. Samo w sobie publikuje już konkretny algorytm i w ten sposób możemy dostarczyć do naszego programu pewien szkielet sterowania zachowaniem.
Dziękuję i zapraszam do dalszego czytania:).
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 - Concat
Następny: Programowanie Reaktywne - Kombinatorzy - Start With