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
Zapewne każdy naukowiec lubi się bawić próbkami. Jako programista także jestem naukowce. Testuję, próbuje. Eksperymentuje cały czas z nowymi IT-wynalazkami. Takie życie, takie hobby…
Sample
Biblioteczka Rxowa pozwala nam także, na pobieranie próbek ze strumieni. Stop, jakie pobieranie przecież to programowanie reaktywne. Próbki dostajemy prosto z dystrybutora. Trzeba tylko namiary zostawić.
Próbki pobierzemy z pewnego źródła (co 10ms), jakim jest Observable.Interval, ale to już znamy;)
1
var observable = Observable.Interval(TimeSpan.FromMilliseconds(10));
W celach demonstracyjnych napisałem prostą klasie PickASample, gdzie większość magii dzieje się w konstruktorze.
Słowo kluczowe Sample, przyjmujące oczywiście parametr TimeSpan. Nakładamy tym samym filtr na bazowy strumień i publikujemy w nowym strumieniu jedną dostarczoną przez bazowego dostawcę dane co określony czas.
Observable.Interval -> Sample -> próbka
Na nowy strumień musimy się zapisać jednak wcześniej wykonujemy mały trik. Korzystamy z .Timestamp(). Skutkuje to opakowaniem danych pochodzących ze strumienia stemplem czasowym (takich operacji jest więcej, ale o tym w dalszych postach ;)). Dzięki takiemu zabiegowi mam i index + czas, w jakim zostały rozesłane. Efekt jest widoczny w przykładzie w projekcie Sample na repozytorium wyzwania: GitHub.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public PickASample(IObservable<long> observable, int seconds)
{
_seconds = seconds;
var timeSpan = TimeSpan.FromSeconds(seconds);
_simpleObservable = observable
.Sample(timeSpan)
.Timestamp()
.Subscribe(
timestamp =>
{
Console.WriteLine($"Sample every {_seconds}[s]: {timestamp}.");
},
W celach informacyjnych zapisane zostały sekundy w klasie. Tak by potem identyfikować wyniki w odniesieniu do konkretnych obiektów PickASample.
Na koniec warto byłoby użyć jeszcze klasy do stworzenia obiektu. Oczywiście zapisujemy obiekty do późniejszego niszczenia (IDisposable).
1
2
3
4
5
6
var sampleList = new List<IDisposable>
{
new PickASample(observable, 1),
new PickASample(observable, 3),
new PickASample(observable, 5)
};
Zapisanych będzie trzech odbiorców. Z odpowiednio ustawionymi czasami pobierania próbek na 1s, 3s, 5s.
Zakończenie
Wyniki działania zamieszczonych fragmentów kodu, najlepiej sprawdzić odpalając cały projekt z GitHub-a. Zapraszam.
Strzelił mi dzisiaj do głowy niecny plan. By nagrać serie video na YT o podobnej tematyce. Ale czy to dojdzie do skutku. Być może to temat kolejnego wyzwania…
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 - Zabawa z czasem - Delay
Następny: Programowanie Reaktywne - Zabawa z czasem - Throttle.–>