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
A jak funkcjonują ten cały mechanizm obserwowanego i obserwatora? Przecież muszą być obrabiane w pocie czoła przez nasze wspaniałe CPU… Magia dzieje się poza naszym polem widzenia.
Biblioteka Rx udostępnia mechanizm harmonogramu. Odpowiedzialny jest za rozsyłanie powiadomień do subskrybentów.
Schedulery
Do dyspozycji mamy dość sporą grupę scheduler-ów, skupię się na kilku głównych.
W tym celu napisałem klasę pomocniczą opartą na poznanym już terminie Timerów o nazwie ExampleTimer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public ExampleTimer(String name, IScheduler scheduler)
{
Initialize(name);
_timerObservable = Observable.Timer(_dueTime, _period, scheduler);
Subscribe();
}
private void Initialize(String name)
{
_dueTime = TimeSpan.FromSeconds(1);
_period = TimeSpan.FromSeconds(1);
_name = name;
}
ImmediateScheduler - bazując na tym zostanie uruchomiony natychmiast na bierz, działa na bieżącym wątku, synchronicznie.
1
new ExampleTimer("ImmediateScheduler", ImmediateScheduler.Instance)
CurrentThreadScheduler - bazuje na bieżącym wątku, i jest normalnie kolejkowań jak każda inna operacja. Tym samym może przylagować, podobnie jak Immediate działa synchronicznie.
1
new ExampleTimer("CurrentThreadScheduler", CurrentThreadScheduler.Instance)
NewThreadScheduler - działa na nowym niezależnym wątku, dobrze nadaje się do długich działań, działa asynchronicznie.
1
new ExampleTimer("NewThreadScheduler", NewThreadScheduler.Default)
ThreadPoolScheduler - publikowanie treści pochodzi z puli wątków działających w tle, przeznaczone do krótkotrwałego używania, asynchronicznie.
1
new ExampleTimer("ThreadPoolScheduler", ThreadPoolScheduler.Instance)
TaskPoolScheduler - akcje wyzwalane są w tym przypadku z puli zadań jest to forma bardzie abstrakcyjna aniżeli pula wątków. Najlepiej wykorzystać w krótkich działaniach jest to też działanie asynchronicznie.
1
new ExampleTimer("TaskPoolScheduler", TaskPoolScheduler.Default)
Jeżeli nie zdefiniujemy żadnego schedulera, to wówczas zostanie przydzielony automatycznie na podstawie kontekstu tworzenia obiektu obserwowanego.
Zakończenie
Przeważnie nie ma potrzeby manipulowaniem automatycznego przydzielania Schedulera. Jednak w pewnych sytuacjach można wpłynąć na to jak będzie się zachowywał.
To na tyle w tym pościku, zapraszam do kolejnych.
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 - Timer.
Następny: Programowanie Reaktywne - Nie zapominaj - Subscribe.