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
Krótko, bardzo krótko dzisiaj. A wszystko przez nadchodzące [devwarsztaty.pl]. Będę debiutował. Stres, strach przed oczami… Bla bla bla pora trochę napisać o Rx tak mało ostatnio poruszałem ten temat na tym blogu;) Dzisiaj kolejny operator związany z kombinowaniem. Zapraszam!
Ambiguous
Kto szybszy ten lepszy. Bywa czasem tak że współzawodnictwo jest nam bardzo na rękę. Z innej strony możemy korzystać ze powielonymi strumieniami danych. Wówczas nie wiadomo który wybrać. Jaki obsługiwać a może nie obsługiwać. W tej sytuacji dzisiejszy bohater Observable.Amb jest odpowiedni. Wybiera strumie który najszybciej dostarcza dane, pozostałe pomija.
Ale najpierw mały refaktor, przeniosłem metodę tworzenia generatorów CreateGenerator do do fabryczki.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace RXLib.Factories
{
public static class GeneratorFactory
{
public static IObservable<int> CreateGenerator(int initialState, int conditionValue, int incrementValue, int periodValue)
{
var period = TimeSpan.FromMilliseconds(periodValue);
var generator = Observable.Generate(
initialState,
condition => condition <= conditionValue,
iterate => iterate + incrementValue,
resultSelector => resultSelector,
timeSelector => period
);
Samo użycie Observable.Amb jest banalnie proste, podajemy po prostu listę strumieni jako parametry. Metody Amb i gotowe. Po zapisie na nowego dostawcę treści. Możemy wypisać cóż tam się na nim znajduje. Publikowane treści oczywiście powinny być tego samego typu.
-Bo inaczej jak u diabła mam wybrać z pośród wszystkich dostarczonych źródełek - powiedział Amb po czym rzucił wyjątkiem, aż sie wszystko w sofcie posypało…
1
2
3
4
5
6
7
8
9
10
11
12
var observableGenerator1 = GeneratorFactory.CreateGenerator(0, 100, 1, 30);
var observableGenerator2 = GeneratorFactory.CreateGenerator(1000, 1050, 1, 20);
var observableGenerator3 = GeneratorFactory.CreateGenerator(10000, 10020, 1, 40);
var observableAmbiguous = Observable.Amb(observableGenerator1, observableGenerator2, observableGenerator3);
var subscribent = observableAmbiguous.Subscribe(
item =>
{
Console.WriteLine($"Amb: {item}");
},
exception => Console.WriteLine(exception));
Bardzo banalna metoda, jednak pozwala unikać duplikacji. :)
Zakończenie
To był fast-post. :) Niekiedy takie muszą być. Czasem mam myśli, że już się wyprztykałem i nic więcej nie na piszę. A chce dostarczyć wartość i to może być w takiej sytuacji trudne. Nie mniej jednak liczę skrycie, że ktoś kiedyś wyciągnie coś z tych moich publikacji. Dzięki i zapraszam na kolejne…
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 - Kombinatorzy - Start With
Następny: Programowanie Reaktywne - Kombinatorzy - Merge