1 / 38

Wprowadzenie do Reactive eXtensions dla .NET (RX)

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 P racuje w firmie Rule Financial. Tworzę oprogramowanie wykorzystujące platformę .NET(głównie C #).

Download Presentation

Wprowadzenie do Reactive eXtensions dla .NET (RX)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  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/). • MCPD Windows Developer 4.0 • MCTS ASP.NET 3.5. • maciejzbrzezny@gmail.com • @MaciejZbrzezny

  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 Daj mi Dane Przetwarzam Dane

  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 composeasynchronous and event-based programs using observable collections and LINQ-stylequery 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 experimentalrelease, 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 • Instalkahttp://www.microsoft.com/download/en/details.aspx?id=26649 (trafić do niej można przez MSDN > Learn > Reactive Extensions (http://msdn.microsoft.com/en-us/data/gg577609) > Get it) • NuGet (szukamy RX)

  10. Kolekcje

  11. Przypominamy sobie Enumerator public interfaceIEnumerable<T> { IEnumerator<T> GetEnumerator(); } public interfaceIEnumerator<T>: IDisposable { T Current { get; } boolMoveNext(); void Reset(); } Synchroniczny PULL

  12. Przekształcamy … public interfaceIEnumerable<T> { IEnumerator<T> GetEnumerator(void); } public interfaceIEnumerator<T>: IDisposable { T GetCurrent (void); boolMoveNext(void); void Reset(); }

  13. Przekształcamy … public interfaceIEnumerable<T> { (IDisposable & IEnumerator<T> GetEnumerator(void); } public interfaceIEnumerator<T>: IDisposable { T GetCurrent (void); boolMoveNext(void)throwsException; }

  14. Przekształcamy … public interfaceIEnumerableDual<T> { (IDisposable& IEnumerator<T> GetSetEnumerator(IEnumerator<T>); } public interfaceIEnumerator<T> { T GetCurrent (void); (true | false | Exception) MoveNext(void) throwsException; }

  15. Przekształcamy … public interfaceIEnumerableDual<T> { IDisposableSetEnumerator( IEnumerator<T>); } public interfaceIEnumerator<T> { T GetCurrent (void); (true | false | Exception) MoveNext(void); }

  16. Przekształcamy … public interfaceIEnumerableDual<T> { IDisposableSetEnumerator( IEnumerator<T>); } public interfaceIEnumerator<T> { T GetCurrent (void); (T| false | Exception) MoveNext(void); }

  17. Przekształcamy … public interfaceIEnumerableDual<T> { IDisposableSetEnumerator( IEnumerator<T>); } public interfaceIEnumeratorDual<T> { voidMoveGotNext(T| false | Exception); }

  18. Przekształcamy … public interfaceIEnumerableDual<T> { IDisposableSetEnumerator( IEnumerator<T>); } public interfaceIEnumeratorDual<T> { voidGotT(T); voidGotException (Exception); voidGotNothing (); }

  19. Poznajmy IObservable i IObserver public interfaceIObservable<T> { IDisposableSubscribe( IObserver<T>); } public interfaceIObserver<T> { voidOnNext(T); voidOnException (Exception); voidOnCompleted (); } Asynchroniczny PUSH

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

  21. Obserwowanie i subskrypcja zamiast przeglądania • Konstruujemy / pobieramy IObservable. (W Rxjest 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() OnNext() Subscription 2 OnNext() OnNext()

  22. Do dzieła….

  23. Reactive.Concurrency i Scheduler • CurrentThreadScheduleriScheduler.CurrentThread • ImmediateScheduleriScheduler.Immediate • NewThreadScheduleriScheduler.NewThread • TaskPoolScheduleriScheduler.TaskPool • ThreadPoolScheduleriScheduler.ThreadPool • Dodatkowo: • System.Reactive.Windows.Threading.dll: DispatcherScheduler • System.Reactive.Windows.Forms.dll: ControlScheduler

  24. Observables (1) OnCompleted • Observable.Empty<int>() • Observable.Return(777) • Observable.Throw<int>(newException("msg")) • Observable.Never<int>() • Observable.Range(0,2) newint[0] OnNext newint[]{777} Iterator rzuca Exception OnError Iterator zawiesił się OnNext 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<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 patametrzeIObservable • Działamy na IObservable • Zwracamy delegatę dla Dispose

  26. Do dzieła….

  27. 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()

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

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

  30. Operatory LINQ na IObservable IObservable<T> IObservable<T>

  31. Komponowanie strumieni… --A--A--A--| ----B--B--B--| Amb --A--A--A--| • Amb • Concat • SelectMany • Merge • Zip • CombineLatest • ForkJoin --A--A--A--| -----------B--B--B--| Concat --A--A--A--B--B--B--| -(AX)(AY)(BX)(BY)(AZ)(CX)(BZ)(CY)(CZ)| --A--B--C--| --X--Y--Z--| SelectMany -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)--|

  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 jakReplaySubjectale z pamięcią 1 elementu. IObservable<T> IObservable<T> OnNext OnNext OnNext OnNext Subject OnNext OnNext OnNext OnNext Client

  34. Do dzieła….

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

  36. Podsumowanie Rx = Observables+ LINQ + Schedulers

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

  38. Dziękuję za uwagę. Pytania?

More Related