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
Po uporządkowaniu pewnych kolejnych spraw. Pora na kolejny obiekt, jaki możemy obserwować. Wchodzący w skład timerów. Tym razem chodzi o uproszczoną wersje Observable.Timer…
Observable.Interval
Jeżeli nie ma potrzeby opóźnienia wyzwolenia pierwszego powiadomienia do obserwatorów. Wówczas można skorzystać z prostszej formy timer o nazwie Interval.
Przyjmuje co najmniej jeden parametr i jest to czas co ile będą wyzwalane powiadamianie subskrybentów. Wartość ta jest typu TimeSpan.
1
2
3
4
5
6
7
8
9
10
11
private static void AddSubscribent(List<IDisposable> subscribents,
IObservable<long> observable)
{
var subscribent = observable
.Subscribe(
index => { Console.WriteLine($"Index: {index}"); },
exception => { Console.WriteLine($"Exception: {exception}"); },
() => { Console.WriteLine("Completed"); });
subscribents.Add(subscribent);
}
Drugi parametr to Scheduler, o którym trochę pisałem w poście: Programowanie Reaktywne - Kto za tym stoi? - Scheduler. Podobnie jak poprzednio możemy określić kto będzie odpowiedzialny za obsługę całego bałaganu.
Kod jest bardzo prosty dlatego też pozwoliłem sobie zapisać całe ciało delegatów odpowiednio dla każdej z metod (OnNext, OnError, OnCompleted) w jednej linii.
Oczywiście tak jak poprzednio zachowujemy obserwatorów w liście, do późniejszego usunięcia.
1
2
3
4
5
6
7
8
var observableInterval = Observable.Interval(TimeSpan.FromMilliseconds(200));
var observableIntervalScheduler = Observable.Interval(
TimeSpan.FromMilliseconds(2000),
TaskPoolScheduler.Default);
AddSubscribent(subscribents, observableInterval);
AddSubscribent(subscribents, observableIntervalScheduler);
W celach demonstracyjnych tworzymy dwa obserwowane obiekty, jeden, korzystając z TaskPoolScheduler w celu wymuszenia korzystania z TaskPool.
Będą one publikowały w różnych odstępach czasu.
Zakończenie
Nowa metoda nie wnosi nic nowego, jedynie upraszcza kod w stosunku do Observable.Timer-a.
Jednak im mniej kodu, tym lepiej:)…
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 - Nie zapominaj - Subscribe
Następny: Programowanie Reaktywne - Zabawa z czasem - Buffer