Programowanie Reaktywne - Zabawa z czasem - Delay.

09.02.2018


Artykuł ten jest częścią serii artykułów na temat Programowania reaktywnego.

Zapraszam na GitHub-a.

Tematy

  1. Wstęp
  2. Zabawa z czasem - Timer
  3. Kto za tym stoi? - Scheduler
  4. Nie zapominaj - Subscribe
  5. Zabawa z czasem - Interval
  6. Zabawa z czasem - Buffer
  7. Zabawa z czasem - Delay
  8. Zabawa z czasem - Sample
  9. Zabawa z czasem - Throttle
  10. Zabawa z czasem - Timestamp/TimeInterval
  11. Tworzymy dane - Generators
  12. Tworzymy dane - Własna klasa publikująca
  13. Marudzimy - Skip
  14. Marudzimy - Take
  15. Łap To! - ConsoleKey
  16. Kombinatorzy - Concat
  17. Kombinatorzy - Repeat
  18. Kombinatorzy - Start With
  19. Kombinatorzy - Ambiguous
  20. Kombinatorzy - Merge
  21. Kombinatorzy - Zip
  22. Kombinatorzy - Switch
  23. Kombinatorzy - When-And-Then
  24. Kombinatorzy - Combine Latest
  25. Transformers - Select
  26. Transformers - OfType and Cast
  27. Transformers - Metadata
  28. Bileciki do kontroli - Unit Tests of Interval
  29. Bileciki do kontroli - Unit Tests of Observer Interval
  30. Bileciki do kontroli - Unit Tests of Create Cold/Hot Observable
  31. 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

Reactive Extensions - 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 =>

Reactive Extensions - Delay 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:


Wcześniejszy: Programowanie Reaktywne - Zabawa z czasem - Buffer

Następny: Programowanie Reaktywne - Kto za tym stoi? - Sample.


Zapisz się na listę :)