Wprowadzenie do Reactive eXtensions dla .NET (RX)

1 Wprowadzenie do Reactive eXtensions dla .NET (RX)Autor:...
Author: Sara Bożek
0 downloads 0 Views

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/). MCPD Windows Developer 4.0 MCTS ASP.NET 3.5. @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 danychDaj 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 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) NuGet (szukamy RX)

10 Kolekcje

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

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 IObserverpublic interface IObservable { IDisposable Subscribe( IObserver); } public interface IObserver void OnNext(T); void OnException (Exception); void OnCompleted (); Asynchroniczny PUSH

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

21 Obserwowanie i subskrypcja zamiast przeglądaniaKonstruujemy / 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 Subscription 1 OnNext() OnNext() OnNext() Subscription 2 OnNext() OnNext() OnNext()

22 Do dzieła….

23 Reactive.Concurrency i SchedulerCurrentThreadScheduler 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 Iterator rzuca ExceptionObservables (1) OnCompleted Observable.Empty() Observable.Return(777) Observable.Throw(new Exception("msg")) Observable.Never() Observable.Range(0,2) new int[0] OnNext new int[]{777} Iterator rzuca Exception OnError Iterator zawiesił się OnNext OnNext Enumerable.Range (0,2)

25 Observables (2) Observable.Interval ( Observable.Generate(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 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łaZimne – zawsze te same dane po subskrypcji client IObservable 0, 1, 2, 3, … Subscription 1 Subscription 2 0, 1, 2, 3, … Subscribe() client IObservable 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 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ć Łatwo można filtrować Są inne operatory pozwalające na kompozycję Łatwo zwalniamy zasoby

30 Operatory LINQ na IObservableIObservable IObservable Where Skip Take Select

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

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 IObservable 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: Netherlands/Devdays014 Bart de Smet - DevCamp 2010 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.

36 Observables + LINQ + SchedulersPodsumowanie Rx = Observables + LINQ + Schedulers

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

38 Dziękuję za uwagę. Pytania?