Reactive Extensions–jak wygenerować proste źródła danych. W poprzednim poście pokazałem jak dokonać subskrypcji aby otrzymywać powiadomienia o nowych danych oraz jak skonwertować IEnumerable to IObservable. Dzisiaj chciałbym pokazać kilka metod klasy Observable, które są szczególnie ważne przy pisaniu testów jednostkowych oraz przy nauce RX. Muszę przyznać, że na co dzień korzystam wyłącznie tylko z kilku z nich ale w przypadku UnitTest’ów są już bardzo praktyczne. Observable to zbiór statycznych metod (często rozszerzających) usprawniających pracę z IObservable\IObserver (dla przypomnienia oba interfejsy należą do .NET a nie RX). 1. Return zwraca IObservable, który zawiera wyłącznie jeden element. IObservable<int> source=Observable.Return(54); source.Subscribe(Console.WriteLine); Na wyjściu zostanie wyświetlone 54. 2. Zwraca źródło danych nie zawierające żadnych elementów. Var source = Observable.Never<int>(); source.Subscribe(Console.WriteLine, (error) => Console.WriteLine("Błąd"), () => Console.WriteLine("Koniec")); 3. 4. 5. 6. 7.
Reactive Extensions: Konwersja zdarzeń .NET do RX. Po przeczytaniu poprzednich wpisów, zasada działania i zastosowanie RX powinny być już jasne. Jeśli tak nie jest, koniecznie zachęcam do przeczytania tamtych postów. Jak wspomniałem, RX to ujednolicony model, umożliwiający korzystanie z kolekcji typu “push-based” w jednakowy sposób. Dzisiaj pokażę jak sprawa wygląda dla zdarzeń czyli jak skonwertować EventHandler do IObervable. Oczywiście kluczem do rozwiązania jest klasa Observable, która zawiera mnóstwo rozszerzeń dla interfejsów IObservable\IObserver. Znajduje się tam również metoda FromEventPattern, odpowiedzialna właśnie za konwersje zdarzenia do IObservable. Istnieje kilka sygnatur i używamy ich w zależności od tego jaki sposób bardziej odpowiada nam (od strony dobrych praktyk): // Ivar inputSource = Observable.FromEventPattern<TextChangedEventArgs>(termTextBox, "TextChanged"); // IIvar movingEvents = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>(h => this.MouseMove += h, h => this.MouseMove -= h); Efekt końcowy:
Piotr Zieliński » Reactive Programming. (not yet) 101 Rx Samples - Reactive Framework (Rx) Wiki. You! Yes, you, the one who is still scratching their head trying to figure out this Rx thing. As you learn and explore, please feel free add your own samples here, or tweak existing ones! Anyone can (and should!) Edit this page. (edit button is at the bottom right of each page) Start - Run Code Asynchronously Run a method asynchronously on demand Execute a long-running method asynchronously. // Synchronous operation public DataType DoLongRunningOperation(string param) { ... } public IObservable<DataType> LongRunningOperationAsync(string param) { return Observable.Create<DataType>( o => Observable.ToAsync<string,DataType>(DoLongRunningOperation)(param).Subscribe(o) ); } CombineLatest - Parallel Execution Merges the specified observable sequences into one observable sequence by emitting a list with the latest source elements whenever any of the observable sequences produces an element.
Result Executing 1st on Thread: 3 Executing 2nd on Thread: 4 Executing 3rd on Thread: 3 Done! Where - Simple. Programowanie i Technologie. [RX 1] Wprowadzenie do Reactive Extensions (RX) dla .NET - cz.1 [PL] | Maciej Zbrzezny: Programowanie i Technologie. Jako że nie dawno przedstawiłem na spotkaniu Łódzkiej grupy profesjonalistów IT & .NET prezentację poświęconą „Wprowadzenie do Reactive Extensions (RX) dla .NET” (patrz informacja: Zapraszam na prezentację: "Wstęp do Reactive Extensions dla .NET (RX)" oraz Prezentacja i kod ze spotkania pt.: "Wprowadzenie do Reactive Extensions (RX) dla .NET" [PL]).
Postanowiłem czytelnikom bloga „Programowanie i Technologie” również przybliżyć temat Reactive Extensions, więc jeżeli zdarzyło Ci się tworzyć aplikacje, które wykorzystywały wywołania asynchroniczne. Te asynchroniczne wywołania sprawiły problemy. Wolałbyś otrzymywać dane, zamiast o każdą daną się dopraszać. Znasz LINQ i nie zawahasz się go użyć w szerszym zakresie, to z pewnością powinienieś poznać bliżej Reactive Extensions (RX). Zapraszam do przeczytania pierwszej części serii postów poświęconych RX. Chyba każdy programista, tworzył kiedykolwiek aplikację, której jednym z zadań było pobieranie danych ze źródła danych.
C.d.n. ... [RX 2] Kolekcje, to podstawa, czyli wprowadzenia do Reactive Extensions część 2 [PL] | Maciej Zbrzezny: Programowanie i Technologie. W ramach kontynuacji tematyki związanej z Reactive Extensions (RX)przyjrzyjmy się elementom, które stoją u podstaw ich działania, czyli kolekcjom i wzorcowi Obserwator. W poprzedniej części artykułu poznaliśmy cel przyświecającym twórcom Reactive Extensions (RX) jak i skąd można pobrać wspomniane rozszerzenia. Skoro już mamy zainstalowane Reactive Extensions (Rx), zacznijmy przyglądać się jego możliwością. Jak wcześniej zostało wspomniane, Rx upraszcza programowanie asynchroniczne, pozwala na łatwe filtrowanie czy komponowanie zdarzeń (np. z wykorzystaniem LINQ), a wszystko to dzięki obserwowanym kolekcją. Przyjrzyjmy się więc temu najbardziej elementarnemu elementowi, czyli kolekcjom. Oczywiście, to czym są kolekcje chyba każdy wie, jednak nie każdy skojarzy od razu z nimi interfejsy IEnumerable i Ienumerator.
Stanowią one implementację wzorca projektowego Iterator w celu przeglądania owych kolekcji. Deklaracje tych interfejsów wyglądają następująco: Wykorzystanie tego jest bardzo proste: [RX 6] Przykłady dot. obserwowalnych kolekcji w Reactive Extensions [PL] | Maciej Zbrzezny: Programowanie i Technologie. W poprzednich częściach ([RX 1], [RX 2], [RX 3], [RX 4], [RX 5]) artykułu o Reactive Extensions dla .NET pojawiło się już dość sporo teorii, ale raczej mało przykładów, w tym wpisie chciałbym się skupić właśnie na przykładach bazujących na zdobytej uprzednio wiedzy. Zacznijmy od zastanowienia się nad prostymi subskrypcjami. W przykładzie z wpisu pt.: "[RX 3] Reactive Extensions pierwszy kontakt z kodem", zasubskrybowaliśmy obiekt typu IObservable (funkcją Subscribe) i jako parametr przekazane zostało Console.WriteLine, czyli delegat wypisujący otrzymywane znaki na okno konsoli.
Takie podejście mogło wywołać pewne zdezorientowanie, gdyż zgodnie z postem pt. "[RX 2] Kolekcje, to podstawa, czyli wprowadzenia do Reactive Extensions część 2" (w którym opisany był wzorzec obserwator) argumentem dla Subscribe powinna być instancja obiektu dziedziczącego po interfejsie IObserver. 1.obs.Subscribe( 2. x => Console.WriteLine( "Next Value: {0}", x ), 4. () => Console.WriteLine( "Koniec" ) ) 05. 06. Reactive Extensions. About the Reactive Extensions Whether you are authoring a traditional desktop or web-based application, you have to deal with asynchronous and event-based programming from time to time. Desktop applications have I/O operations and computationally expensive tasks that might take a long time to complete and potentially block other active threads.
Furthermore, handling exceptions, cancellation, and synchronization is difficult and error-prone. Using Rx, you can represent multiple asynchronous data streams (that come from diverse sources, e.g., stock quote, tweets, computer events, web service requests, etc.), and subscribe to the event stream using the IObserver<T> interface. The IObservable<T> interface notifies the subscribed IObserver<T> interface whenever an event occurs. Interfejsy IObservable oraz IObserver. W przyszłych postach chcę zająć się Reactive Extensions, jednak zanim zacznę cykl postów o tym, najpierw przedstawię dwa interfejsy wprowadzone w .NET 4.0. Interfejsy umożliwiają implementację wzorca obserwator. IObserver powinien zostać zaimplementowany dla klasy, która chcę być powiadamiana o zmianach dokonywanych na klasie implementującej IObservable. Przyjrzyjmy się najpierw metodom IObserver: OnCompleted – obserwacja wszelkich zmian zakończona.OnError – wystąpił błąd.OnNext – Nowa zmiana np. dodano element do kolekcji.
Z kolei IObservable wymaga wyłącznie jednej metody, Subscribe odpowiedzialnej za subskrypcję obserwatora. Jak widać IObservable jest generycznym typem. A na zakończenie przykład wykorzystania powyższych klas PersonRepository repository=new PersonRepository(); repository.Subscribe(new SampleObserver()); repository.AddPerson("test"); repository.AddPerson(null); repository.Close(); Explore posts in the same categories:C#, Reactive Programming. Reactive Extensions–wprowadzenie.
Kiedyś już chciałem poprowadzić cykl wpisów o Reactive Extensions i nawet napisałem pierwszy post wprowadzający do interfejsów IObservable, IObserver. Niestety po drodze przytrafiły się tematy które chciałem najpierw opisać i na końcu zrezygnowałem z tego. W między czasie kilka osób pytało o ten cykl ale nie widziałem sensu ponieważ Maciej Zbrzezny już wykonał kawał dobrej roboty i opisał to na swoim blogu w bardzo szczegółowy sposób. Dzisiaj postanowiłem jednak napisać kilka postów o RX po swojemu, z trochę innej perspektywy – może komuś przyda to się, taką mam nadzieje.
Ponadto oprócz podstaw RX chciałbym pokazać jak pisać bardziej zaawansowane rzeczy jak np. rekurencyjny scheduler, który ostatnio wykorzystałem do odpytywania bazy danych o strukturze rekurencyjnej (korzystamy z OPC Framework). Najpierw polecam przeczytanie wpisu o IObservable oraz IObserver. Dzisiaj postaram się odpowiedzieć na pytanie: dlaczego potrzebujemy Reactive Extensions? Zdarzenia, delegaty.
Intro to Rx - Foreword. Reactive programming is not a new concept. I remember studying my first Event Driven module for Visual Basic 5 in 2000. Even then the technology (Visual Basic 5) was already considered somewhat dated. Long before VB5 and the turn of the millennium, we have seen languages supporting events. Over time languages like Smalltalk, Delphi and the .NET languages have popularized reactive or event-driven programming paradigms. This not to say that events are passé: current trends such as CEP (Complex Event Processing), CQRS (Command Query Responsibility Segregation) and rich immersive GUIs, all have events as a fundamental part of their makeup.
The event driven paradigm allows for code to be invoked without the need for breaking encapsulation or applying expensive polling techniques. The Reactive Extensions are effectively a library of implementations of the IObservable<T> and IObserver<T> interfaces for .NET, Silverlight and Windows Phone 7.
This book aims to teach you: