Wprowadzenie do Reactive eXtensions dla .NET (RX)

Slides:



Advertisements
Podobne prezentacje
Równoległe kwerendy danych
Advertisements

Analiza wywołania i przebiegu przerwań w systemie Linux
C++ w Objectivity Marcin Michalak s1744. Pomocne pakiety: Data Definition Language (DDL). Standard Template Library (STL). Active Schema.
Materiały pochodzą z Platformy Edukacyjnej Portalu Wszelkie treści i zasoby edukacyjne publikowane na łamach Portalu
OOPC++ - operatory1 Operatory class complex { private: double re, im; public: complex (double r, double i = 0) { re = r; im = i; } friend complex operator+
PRZYPOMNIENIE!!!!!! Używamy mówiąc o warunku i skutkach jego spełnienia, które są zawsze prawdziwe If + Present Simple,+ Present Simple lub czasownik.
GUI Struktury Spotkanie integracyjne Nazwa wydziału: EAIiE Nazwa katedry: Informatyka Miejsce i data prezentacji: Kraków,
Team Building Copyright, 2003 © Jerzy R. Nawrocki Requirements Engineering Lecture.
Testowanie oprogramowania metodą badania pokrycia kodu
Łukasz Monkiewicz.
Współprogramy Plan: Motywacja Składnia Scenariusz obiektu współprogramu Przykłady Producent – konsument ( instrukcja attach ) Czytelnik -pisarze ( instukcja.
MS SQL SERVER udział w rynku. Source: Gartner Dataquest (May 2006) Company Market Share (%) Market Share (%) Growth (%) Oracle6, ,
DIRECT &INDIRECT QUESTIONS
Przestrzeń System podstawowe klasy i klasy bazowe.
1 Building Integration System - Training Internal | ST-IST/PRM1 | 02/2008 | © Robert Bosch GmbH All rights reserved, also regarding any disposal,
Tadeusz Janasiewicz IT Group, Tadeusz Janasiewicz, WSUS, IT Group, r.
Najpopularniejsze aplikacje ASP.NET i PHP.
Do you know who I am? Czy wiesz kim ja jestem Soy alguien con quien convives a diario Im somebody you live with every day.. Jestem kims z kim żyjesz.
Download the latest version at This message wont show up when youre presenting Windows Phone 7.
Zarządzanie magazynem danych - Storage Spaces w Windows Server 2012 oraz w Windows 8 Błażej Miśkiewicz MCTMCP MCSA MCTS MCITP.
Damian Wojdan Kraków,
Asynchroniczność w Windows 8 Jakub Binkowski. O mnie Jakub Binkowski Lead.NET Developer.
Przygotował: Adrian Walkowiak
„Imię to słowna forma cienia To coś, co w słońcu, czy też w bidzie
Czyli jak zrobić prezentację komputerową?
Co można zwiedzić w WIELKIEJ BRYTANII Pamiętajmy o miejscach które możemy zwiedzić na przykład w WIELKIEJ BRYTANII. I też czym różni się ta wyspa od naszego.
Małgorzata Pietroczuk
FIZYKA na służbie b’Rowersa ...krótki kurs.
Irina Svichenyuk Valeria Poligova Skąd biorą się motywy dla podróży? Skąd biorą się motywy dla podróży? Każdy człowiek ma jakieś własne potrzeby. To.
Młodzież a wolontariat.. Opracowanie: Judyta Szłapa Urszula Buczek.
Podstawy programowania
Prawa Dziecka.
The Grumpy Test If at least one of these pictures does not make you smile, then you are grumpy and need to go back to bed. Test na ponuraka Jak nie usmiechniesz.
Uwaga !!! Uczniowie SP 32 w Toruniu ! Zapraszamy was i Wasze rodziny do wzięcia udziału w Festynie Zdrowia, który odbędzie się 31 maja 2013 roku podczas.
Chwila zadumy ! Moi drodzy, Wysyłam te słowa do wielu osób nie bacząc, czy ktoś jest wierzący czy nie... Dla mnie jest to przesłanie do Wszystkich......
Czy znasz? GŁÓWNE PRAWDY WIARY.
Wykonała Sylwia Kozber
Cz.8 Zdarzenia. Refleksja – przypomnienie Event Programowanie zdarzeniowe Do dzieła!
Krótka historia asynchroniczności w.NET Jakub Binkowski.
Marek Krupa Coś o mnie.
Antonie de Saint-Exupery
Powrót do sukcesu Analiza przypadku Princessy (rola badań marketingowych podczas rozwoju produktu: ) Powrót do sukcesu Analiza przypadku Princessy.
Instalacja serwera WWW na komputerze lokalnym
HTML Podstawy języka hipertekstowego Damian Urbańczyk.
Jak się uchronić przed zagrożeniami wynikającymi z użytkowania sieci?
Typy palet.
SKĄD WIEM, KIM JESTEM? O TOŻSAMOśCI I TOŻSAMOŚCIACH
Warsztaty C# Część 2 Grzegorz Piotrowski Grupa.NET PO
Warsztaty C# Część 3 Grzegorz Piotrowski Grupa.NET PO
KINECT – czyli z czym to się je?. Damian Zawada
SKALA MAPY Skala – stosunek odległości na mapie do odpowiadającej jej odległości w terenie. Skala najczęściej wyrażona jest w postaci ułamka 1:S, np. 1:10.
To śmieszne...
PolGIS jako nowoczesny system do paszportyzacji sieci
Wiktoria i Beata ZDROWIE. ,,Małe co nie co Idę do sklepiku naszego, Myślę, wybiorę sobie coś dobrego, Tu coca-cola na mnie zerka, Tu miałbym ochotkę na.
ZŁUDZENIA OPTYCZNE Większe, mniejsze? Jest czy nie ma? Wygięte! ..?
Temat 5: Elementy meta.
Temat 4: Znaki diakrytyczne i definiowanie języka dokumentu
Serwis informacyjny skupiający się na problematyce Unii Europejskiej, państw europejskich oraz kwestii dotyczących obywateli, interesariuszy i naukowców.
Teksty prymarne (original texts) to teksty autentyczne, nie są przeznaczone dla celów dydaktycznych; teksty adaptowane (simplified/adapted texts)są przystosowane.
Rzeszów r.. Liczba osób badanych 3 Odpowiedzi badanych na temat stosowania krzyku przez rodziców 4.
GABRIEL GARCÍA MÁRQUEZ
Największym bólem w życiu nie jest śmierć, lecz bycie ignorowanym.
KW2 Czy można żyć bez KW2? - Można, ale co to za życie?... [S.Toton 2001r.n.e.]
dla programistów Windows Phone
TROCHĘ HISTORII Marek Zając PO CO UŻYWAĆ OPENCL? Marek Zając.
Silverlight 4 dla Windows Phone 7
1.
BVMS 3.0 Moduł 13: Opcje zapisu iSCSI
Wydział Elektroniki Kierunek: AiR Zaawansowane metody programowania Wykład 6.
Security & Communications Training Academy | Date 2011 © Robert Bosch GmbH reserves all rights even in the event of industrial property rights. We reserve.
Zapis prezentacji:

Wprowadzenie do Reactive eXtensions dla .NET (RX) Autor: Maciej Zbrzezny Rule Financial, Łódzka Grupa Profesjonalistów IT & .NET 2011.11.03

O mnie Nazywam się Maciej Zbrzezny Pracuje w firmie Rule Financial. Tworzę oprogramowanie wykorzystujące platformę .NET(głównie C#). Autor bloga „Programowanie i Technologie” (http://maciej-progtech.blogspot.com/). MCPD Windows Developer 4.0 MCTS ASP.NET 3.5. maciejzbrzezny@gmail.com @MaciejZbrzezny

Dla kogo? Czy zdarzyło Ci się tworzyć aplikacje, które wykorzystywały wywołania asynchroniczne? Czy, wywołania asynchroniczne sprawiły problemy? Czy wolałbyś otrzymywać dane zamiast o każdą daną się dopraszać? Czy znasz LINQ i chciałbyś go wykorzystywać w większym zakresie?

Problem: pobieranie danych Daj mi Dane Przetwarzam Dane

Asynchroniczność Dzisiejszy świat jest asynchroniczny, a my nie chcemy być blokowani Źródeł danych może być wiele, co w przypadku, gdy musimy połączyć dane z wielu z nich Możemy nie być zainteresowaniu wszystkimi danymi jak je wybierać, czy filtrować Jesteśmy przyzwyczajeni do prostych rozwiązań, najłatwiej przeglądać po prostu kolekcje danych

Misja RX The Reactive Extensions (Rx)... ...is a library to compose asynchronous and event-based programs using observable collections and LINQ-style query operators.

Rx … Pozwala na uproszczenie kodu związanego z programowaniem asynchronicznym oraz opartym na zdarzeniach, Daje możliwość komponowania (łączenia) różnych asynchronicznych operacji oraz ich wyników. Oferuje inne podejście do kolekcji oraz zdarzeń. W Rx są one traktowane jako źródła danych, które możemy obserwować.

Skąd wziąć RX? Nie ma RX w .NET 3.5 SP1 ani .NET 4.0, ale: Można dla nich pobrać W .NET 4.0 przygotowano już pewne ułatwienia Rx jest też dostępne dla: Silverlight 4 (5 w experimental release, 3 –starsze wersje RX) Windows Phone 7 (dostępne już w ROM) XNA 3 i 4 (starsze wersje RX, nie będzie wsparcia) Reactive Extensions for JavaScript (RxJS)

Jak pobrać RX Instalka http://www.microsoft.com/download/en/details.aspx?id=2 6649 (trafić do niej można przez MSDN > Learn > Reactive Extensions (http://msdn.microsoft.com/en- us/data/gg577609) > Get it) NuGet (szukamy RX)

Kolekcje

Przypominamy sobie Enumerator public interface IEnumerable<T> { IEnumerator<T> GetEnumerator(); } public interface IEnumerator<T>: IDisposable T Current { get; } bool MoveNext(); void Reset(); Synchroniczny PULL

Przekształcamy … public interface IEnumerable<T> { IEnumerator<T> GetEnumerator(void); } public interface IEnumerator<T>: IDisposable T GetCurrent (void); bool MoveNext(void); void Reset();

Przekształcamy … public interface IEnumerable<T> { (IDisposable & IEnumerator<T> GetEnumerator(void); } public interface IEnumerator<T>: IDisposable T GetCurrent (void); bool MoveNext(void) throws Exception;

Przekształcamy … public interface IEnumerableDual<T> { (IDisposable & IEnumerator<T> GetSetEnumerator( IEnumerator<T>); } public interface IEnumerator<T> T GetCurrent (void); (true | false | Exception) MoveNext(void) throws Exception;

Przekształcamy … public interface IEnumerableDual<T> { IDisposable SetEnumerator( IEnumerator<T>); } public interface IEnumerator<T> T GetCurrent (void); (true | false | Exception) MoveNext(void);

Przekształcamy … public interface IEnumerableDual<T> { IDisposable SetEnumerator( IEnumerator<T>); } public interface IEnumerator<T> T GetCurrent (void); (T| false | Exception) MoveNext(void);

Przekształcamy … public interface IEnumerableDual<T> { IDisposable SetEnumerator( IEnumerator<T>); } public interface IEnumeratorDual<T> void MoveGotNext(T| false | Exception);

Przekształcamy … public interface IEnumerableDual<T> { IDisposable SetEnumerator( IEnumerator<T>); } public interface IEnumeratorDual<T> void GotT(T); void GotException (Exception); void GotNothing ();

Poznajmy IObservable i IObserver public interface IObservable<T> { IDisposable Subscribe( IObserver<T>); } public interface IObserver<T> void OnNext(T); void OnException (Exception); void OnCompleted (); Asynchroniczny PUSH

Obserwowanie i subskrypcja zamiast przeglądania Jestem zainteresowany Danymi (subscribe) Przetwarzam Dane Error Dane KONIEC

Obserwowanie i subskrypcja zamiast przeglądania Konstruujemy / pobieramy IObservable. (W Rx jest wiele metod pomocniczych tworzące IObservable z tablic, list, zdarzeń, ….) Subskrybujemy przekazując nasz obserwator (IObserver) lub odpowiednie delegacje. Wykonujemy „Dispose” na subskrypcji której dłużej nie potrzebujemy client IObservable<T> Subscription 1 OnNext() OnNext() OnNext() Subscription 2 OnNext() OnNext() OnNext()

Do dzieła….

Reactive.Concurrency i Scheduler CurrentThreadScheduler i Scheduler.CurrentThread ImmediateScheduler i Scheduler.Immediate NewThreadScheduler i Scheduler.NewThread TaskPoolScheduler i Scheduler.TaskPool ThreadPoolScheduler i Scheduler.ThreadPool Dodatkowo: System.Reactive.Windows.Threading.dll: DispatcherScheduler System.Reactive.Windows.Forms.dll: ControlScheduler

Iterator rzuca Exception Observables (1) OnCompleted Observable.Empty<int>() Observable.Return(777) Observable.Throw<int>(new Exception("msg")) Observable.Never<int>() Observable.Range(0,2) new int[0] OnNext new int[]{777} Iterator rzuca Exception OnError Iterator zawiesił się OnNext OnNext Enumerable.Range (0,2)

Observables (2) Observable.Interval ( Observable.Generate( TimeSpan.FromMilliseconds (100)); Observable.Generate( 0, i => i < 10, i => i + 1, i => i); Observable.Create<int>( observer => { observer.OnNext( 77 ); observer.OnCompleted(); return ( () => { } ); } ); I inne … Nowa wartość co 100 ms for(int i=0;i<10;i++) yield return i; // dostępne również // z opóźnieniem // czasowym Przekazujemy delegatę o patametrze IObservable Działamy na IObservable Zwracamy delegatę dla Dispose

Do dzieła….

Ciepło – zimno, czyli zimne i ciepłe źródła Zimne – zawsze te same dane po subskrypcji client IObservable<T> 0, 1, 2, 3, … Subscription 1 Subscription 2 0, 1, 2, 3, … Subscribe() client IObservable<T> Mouse Events Ciepłe – zawsze aktualne dane [x1,y1] [x2,y2] … Subscription 1 Subscription 2 [x2,y2] [x3,y3] … Subscribe()

Zdarzenia w .NET niby pożyteczne, łatwe, ale… myForm.MouseMove += (sender, args) => { if (args.Location.X == args.Location.Y) // chcę wywołać inne zdarzenie }. myForm.MouseMove -= /* a co tutaj?? */ Jak przekazywać? Ukryte źródło danych Jak filtrować? Jak obsługiwać błędy ?? Jak komponować zdarzenia? Co z uwalnianiem zasobów?

… obserwowanie jest lepsze Źródło punktów IObservable<Point> mouseMoves = Observable.FromEventPattern<MouseEventArgs> (this, "MouseMove" ) .Select( ev => ev.EventArgs.Location ); var filtered = mouseMoves .Where(pos => pos.X == pos.Y); var subscription = filtered.Subscribe ( …) Subscription.Dispose(); Obiekty można przekazywać Łatwo można filtrować Są inne operatory pozwalające na kompozycję Łatwo zwalniamy zasoby

Operatory LINQ na IObservable IObservable<T> IObservable<T> Where Skip Take Select

Komponowanie strumieni… --A--A--A--| ----B--B--B--| Amb Amb Concat SelectMany Merge Zip CombineLatest ForkJoin --A--A--A--| --A--A--A--| -----------B--B--B--| Concat --A--A--A--B--B--B--| --A--B--C--| --X--Y--Z--| SelectMany -(AX)(AY)(BX)(BY) (AZ)(CX)(BZ)(CY)(CZ)| -A--B--C---| --X--Y--Z--| Merge --AX-BY-CZ--| -A--B--C---| --X--Y--Z--| Zip -(AX)-(BY)-(CZ)--| -A----B--C--| -UWXYZ--| CombineLatest -(AU)(AW)(BX)(BY)(CZ)| -A----B--C--| -UWXYZ--| ForkJoin -----------(CZ)--|

Do dzieła….

Tematy (Subject) Subject może być obserwowany (jest IObservable) Subject jest obserwatorem (jest IObserver) Wariacje: ReplaySubject: - oferuje pełną historię AsyncSubject – oferuje to co zostało wrzucone na końcu i kończy się BehaviorSubject: podobnie jak ReplaySubject ale z pamięcią 1 elementu. IObservable<T> IObservable<T> OnNext OnNext OnNext OnNext Subject OnNext OnNext OnNext OnNext Client

Do dzieła….

Literatura Channel 9 a zwłaszcza: Mike Taulty - Reactive Extensions for .NET for the Rest of Us: http://channel9.msdn.com/Events/DevDays/DevDays-2011- Netherlands/Devdays014 Bart de Smet - DevCamp 2010 Keynote - Rx: Curing your asynchronous programming blues: http://channel9.msdn.com/Blogs/codefest/DC2010T0100- Keynote-Rx-curing-your-asynchronous-programming-blues Data Developer Center > Learn > Reactive Extensions (Rx) > Beginner's Guide to Reactive Extensions for .NET (http://msdn.microsoft.com/en-us/data/gg577611) a zwłaszcza Design Guidelines.

Observables + LINQ + Schedulers Podsumowanie Rx = Observables + LINQ + Schedulers

Rule Financial - szuka C# developer Senior C# developer Developer .NET/Silverlight http://www.rulefinancial.com/careers/global- vacancies.aspx

Dziękuję za uwagę. Pytania?