Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

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

Podobne prezentacje


Prezentacja na temat: "Wprowadzenie do Reactive eXtensions dla.NET (RX) Autor: Maciej Zbrzezny Rule Financial, Łódzka Grupa Profesjonalistów IT &.NET 2011.11.03."— Zapis prezentacji:

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

2 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/).http://maciej-progtech.blogspot.com/ MCPD Windows Developer 4.0 MCTS ASP.NET

3 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?

4 Problem: pobieranie danych

5 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

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

7 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ć.

8 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)

9 Jak pobrać RX Instalka (trafić do niej można przez MSDN > Learn > Reactive Extensions (http://msdn.microsoft.com/en- us/data/gg577609) > Get it) 6649http://msdn.microsoft.com/en- us/data/gg NuGet (szukamy RX)

10 Kolekcje

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

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

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

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

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

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

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

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

19 Poznajmy IObservable i IObserver public interface IObservable { IDisposable Subscribe( IObserver ); } public interface IObserver { void OnNext(T); void OnException (Exception); void OnCompleted (); }

20 Obserwowanie i subskrypcja zamiast przeglądania

21 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 IObservable client Subscription 1 Subscription 2 OnNext()

22 Do dzieła….

23 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

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

25 Observables (2) Observable.Interval ( TimeSpan.FromMilliseconds (100)); Observable.Generate( 0, i => i < 10, i => i + 1, i => i); Observable.Create ( 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 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 Przekazujemy delegatę o patametrze IObservable Działamy na IObservable Zwracamy delegatę dla Dispose

26 Do dzieła….

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

28 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?? */ Ukryte źródło danych Jak filtrować? Jak komponować zdarzenia? Co z uwalnianiem zasobów? Jak przekazywać? Jak obsługiwać błędy ??

29 … obserwowanie jest lepsze IObservable mouseMoves = Observable.FromEventPattern (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ć Źródło punktów Łatwo można filtrować Są inne operatory pozwalające na kompozycję Łatwo zwalniamy zasoby

30 Operatory LINQ na IObservable WhereSkipTakeSelect IObservable

31 Komponowanie strumieni… Amb Concat SelectMany Merge Zip CombineLatest ForkJoin --A--A--A--| B--B--B--| Concat --A--A--A--B--B--B--| --A--A--A--| ----B--B--B--| Amb --A--A--A--| --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 (CZ)--| -(AU)(AW)(BX)(BY)(CZ)| -A----B--C--| -UWXYZ--| ForkJoin

32 Do dzieła….

33 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 OnNext Subject Client OnNext

34 Do dzieła….

35 Literatura Channel 9 a zwłaszcza: Mike Taulty - Reactive Extensions for.NET for the Rest of Us: Netherlands/Devdays014 Netherlands/Devdays014 Bart de Smet - DevCamp 2010 Keynote - Rx: Curing your asynchronous programming blues: Keynote-Rx-curing-your-asynchronous-programming-blues 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.http://msdn.microsoft.com/en-us/data/gg577611Design Guidelines

36 Podsumowanie

37 Rule Financial - szuka C# developer Senior C# developer Developer.NET/Silverlight vacancies.aspx vacancies.aspx

38 Dziękuję za uwagę. Pytania?


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

Podobne prezentacje


Reklamy Google