GoDev

Blog programisty.

Programowanie Reaktywne - Zabawa z czasem - Sample.


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

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

Reactive Extensions - 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}.");
			},			

Reactive Extensions - Sample

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:


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

Następny: Programowanie Reaktywne - Zabawa z czasem - Throttle.–>