MR. Dev

Blog programisty.

Programowanie Reaktywne - Zabawa z czasem - Interval.


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

Reactive Extensions - Scheduler

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);
}

Reactive Extensions - Interval

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:


Wcześniejszy: Programowanie Reaktywne - Nie zapominaj - Subscribe

Następny: Programowanie Reaktywne - Zabawa z czasem - Buffer