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 na tapetę coś prostego. Bazując na operatorze Interval. Złapiemy ogon niczym w filmach szpiegowskich. A nawet wiele…
Observable.Delay
Do przepisu będziemy potrzebować już istniejący strumień. Do tego celu najłatwiej użyć Observable.Interval.
Do głównego strumienia generowanego przez Interval. Dodamy tak zwany ogon. Klasyczna sytuacja z Hollywood. Bohater jedzie samochodem. Nagle uświadamia sobie, że podąża za nim samochód. Przyśpiesza, ogon też przyśpiesza.
Ale my nie będziemy starali się go zgubić. A jedynie doczepić kilka wagonów do lokomotywy.
Na początek dopisujemy się do Observable.Interval, będzie to nasz obiekt do śledzenia.
1
2
3
4
5
6
7
8
9
var subscribeInterval = observableInterval.Subscribe(index =>
{
Console.WriteLine($"{DateTime.UtcNow} Followed!");
});
for (var i = 0; i < 10; i++)
{
spies.Add(new Spy(observableInterval, rand.Next(3000), $"Spy {i}"));
}
Następnie tworzymy 10 szpiegów, nadając im nazwę oraz losową wartość 0 - 3000 [ms]. Będzie to odstęp czasowy szpiega od obserwowanego.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
internal class Spy : IDisposable
{
private string _spyName;
private IDisposable _spySubscribe;
public Spy(IObservable<long> observableInterval, int time, string spyName)
{
_spyName = spyName;
var delay = TimeSpan.FromMilliseconds(time);
_spySubscribe = observableInterval.Delay(delay)
.Subscribe(
index =>
{
Console.WriteLine($"{DateTime.UtcNow} {_spyName}");
},
exception =>
Do śledzenia wykorzystamy Observable.Delay. Ten operator spowoduje publikowanie wiadomości w określonym odstępie czasu od bazowego głównego strumienia. Podawanym jako parametr typu TimeSpan. Następnie wystarczy już tylko oczywiście zapisać się na strumień nowego dystrybutora.
Tak samo za pociągiem podążają wagony, z małym nagięcie. Wagony są do siebie nawzajem podczepiane. Tutaj Delay doczepia się do bazowego “wodza”.
Zakończenie
Mam cichą nadzieję, że moje aluzje, przykłady pomogą w zrozumieniu poruszanej tematyki. A wręcz jej nie utrudnią.
Pomalutku dostrzegam pewien problem, otóż przy nadmiernym korzystaniu z tych wszystkich mechanizmów, jakie dostarczają Rx. Może się okazać, że będziemy mieli nowy Callback Hell. Jak zawsze sprawdza się znana zasada. Można wszystko, ale w umiarze.
Zapraszam do przeanalizowania projektu Delay, na GitHub.
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 - Buffer
Następny: Programowanie Reaktywne - Kto za tym stoi? - Sample.