Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Wprowadzenie do Reactive                  eXtensions dla .NET (RX)                                 Autor: Maciej ZbrzeznyR...
O mnie   Nazywam się Maciej Zbrzezny   Pracuje w firmie Rule Financial.   Tworzę oprogramowanie wykorzystujące    platf...
Dla kogo?   Czy zdarzyło Ci się tworzyć aplikacje, które    wykorzystywały wywołania asynchroniczne?   Czy, wywołania as...
Problem: pobieranie danych
Asynchroniczność   Dzisiejszy świat jest asynchroniczny, a my nie    chcemy być blokowani   Źródeł danych może być wiele...
Misja RXThe Reactive Extensions (Rx)......is a library to compose asynchronous and event-based programs using observable c...
Rx …   Pozwala na uproszczenie kodu związanego z    programowaniem asynchronicznym oraz opartym na    zdarzeniach,   Daj...
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 ...
Jak pobrać RX   Instalka    http://www.microsoft.com/download/en/details.aspx?i    d=26649 (trafić do niej można przez MS...
Kolekcje
Przypominamy sobie Enumeratorpublic interface IEnumerable<T> {   IEnumerator<T> GetEnumerator(); } public interface IEnume...
Przekształcamy …public interface IEnumerable<T> {   IEnumerator<T> GetEnumerator(void); } public interface IEnumerator<T>:...
Przekształcamy …public interface IEnumerable<T> {   (IDisposable & IEnumerator<T>GetEnumerator(void); } public interface I...
Przekształcamy … public interface IEnumerableDual<T>  {    (IDisposable & IEnumerator<T> GetSetEnumerator(IEnumerator<T>);...
Przekształcamy …public interface IEnumerableDual<T> {   IDisposable SetEnumerator( IEnumerator<T>); } public interface IEn...
Przekształcamy …public interface IEnumerableDual<T> {   IDisposable SetEnumerator( IEnumerator<T>); } public interface IEn...
Przekształcamy …public interface IEnumerableDual<T> {   IDisposable SetEnumerator( IEnumerator<T>); }public interface IEnu...
Przekształcamy …public interface IEnumerableDual<T> {   IDisposable SetEnumerator( IEnumerator<T>); } public interface IEn...
Poznajmy IObservable i IObserverpublic interface IObservable<T> {   IDisposable Subscribe( IObserver<T>); } public interfa...
Obserwowanie i subskrypcja zamiastprzeglądania
Obserwowanie i subskrypcja zamiastprzeglądania   Konstruujemy / pobieramy                                 Subscription   ...
Do dzieła….
Reactive.Concurrency i Scheduler   CurrentThreadScheduler i Scheduler.CurrentThread   ImmediateScheduler i Scheduler.Imm...
Observables (1)                               OnComplete                                   d   Observable.Empty<int>()   ...
Observables (2)   Observable.Interval (         Nowa wartość co    TimeSpan.FromMilliseconds          100 ms    (100));  ...
Do dzieła….
Ciepło – zimno, czyli zimne i ciepłe źródłaZimne –                                                          IObservable<T>...
Zdarzenia w .NET nibypożyteczne, łatwe, ale…      Jak przekazywać?             Ukryte źródło danych myForm.MouseMove += (s...
… obserwowanie jest lepsze                        Źródło                                                   punktów      IO...
Operatory LINQ na IObservableIObservable<T>                                                IObservable<T>                 ...
Komponowanie strumieni…                 --A--A--A--|   Amb                                     Amb       --A--A--A--|    ...
Do dzieła….
Tematy (Subject)   Subject może być                     IObservable<T                 IObservable<T    obserwowany (jest ...
Do dzieła….
Literatura   Channel 9 a zwłaszcza:       Mike Taulty - Reactive Extensions for .NET for the Rest of        Us: http://c...
Podsumowanie
Rule Financial - szuka   C# developer   Senior C# developer   Developer .NET/Silverlight   http://www.rulefinancial.co...
Dziękuję za uwagę.     Pytania?
Upcoming SlideShare
Loading in …5
×

Wprowadzenie do Reactive Extensions (RX) dla .NET

4,343 views

Published on

Prezentacja przedstawiona na spotkaniu Łódzkiej Grupy Profesjonalistów IT & .NET, pt. "Wprowadzenie do Reactive Extensions (RX) dla .NET"

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 nie zawahasz się go użyć w szerszym zakresie?
Jeżeli odpowiedź na większość z postawionych tu pytań jest twierdząca to powinieneś poznać bliżej Reactive Extensions.
Reactive Extensions (Rx) to zestaw bibliotek pozwalający na tworzenie asynchronicznych i bazujących na zdarzeniach aplikacji z wykorzystaniem obserwowalnych sekwencji i LINQ. Dzięki wykorzystaniu Rx programista tworzy asynchroniczne strumienie danych przy użyciu obserwowalnych list (Observables), odpytuje te asynchroniczne strumienie z wykorzystaniem LINQ i ma możliwość parametryzowania wielowątkowości z wykorzystaniem mechanizmu Schedulers.
Czyli w uproszczeniu: Rx = Observables + LINQ + Schedulers.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Wprowadzenie do Reactive Extensions (RX) dla .NET

  1. 1. Wprowadzenie do Reactive eXtensions dla .NET (RX) Autor: Maciej ZbrzeznyRule Financial, Łódzka Grupa Profesjonalistów IT & .NET 2011.11.03
  2. 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. 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. 4. Problem: pobieranie danych
  5. 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. 6. Misja RXThe Reactive Extensions (Rx)......is a library to compose asynchronous and event-based programs using observable collections andLINQ-style query operators.
  7. 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. 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. 9. Jak pobrać RX Instalka http://www.microsoft.com/download/en/details.aspx?i d=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. 10. Kolekcje
  11. 11. Przypominamy sobie Enumeratorpublic interface IEnumerable<T> { IEnumerator<T> GetEnumerator(); } public interface IEnumerator<T>:IDisposable { T Current { get; } bool MoveNext(); void Reset(); }
  12. 12. Przekształcamy …public interface IEnumerable<T> { IEnumerator<T> GetEnumerator(void); } public interface IEnumerator<T>:IDisposable { T GetCurrent (void); bool MoveNext(void); void Reset(); }
  13. 13. Przekształcamy …public interface IEnumerable<T> { (IDisposable & IEnumerator<T>GetEnumerator(void); } public interface IEnumerator<T>: IDisposable { T GetCurrent (void); bool MoveNext(void) throws Exception;}
  14. 14. 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;}
  15. 15. Przekształcamy …public interface IEnumerableDual<T> { IDisposable SetEnumerator( IEnumerator<T>); } public interface IEnumerator<T> { T GetCurrent (void); (true | false | Exception) MoveNext(void);}
  16. 16. Przekształcamy …public interface IEnumerableDual<T> { IDisposable SetEnumerator( IEnumerator<T>); } public interface IEnumerator<T> { T GetCurrent (void); (T| false | Exception) MoveNext(void);}
  17. 17. Przekształcamy …public interface IEnumerableDual<T> { IDisposable SetEnumerator( IEnumerator<T>); }public interface IEnumeratorDual<T>{ void MoveGotNext(T| false | Exception);}
  18. 18. Przekształcamy …public interface IEnumerableDual<T> { IDisposable SetEnumerator( IEnumerator<T>); } public interface IEnumeratorDual<T> { void GotT(T); void GotException (Exception); void GotNothing ();}
  19. 19. Poznajmy IObservable i IObserverpublic interface IObservable<T> { IDisposable Subscribe( IObserver<T>); } public interface IObserver<T> { void OnNext(T); void OnException (Exception); void OnCompleted ();}
  20. 20. Obserwowanie i subskrypcja zamiastprzeglądania
  21. 21. Obserwowanie i subskrypcja zamiastprzeglądania Konstruujemy / pobieramy Subscription OnNext() IObservable. (W Rx jest OnNext() IObservable<T> 1 OnNext() wiele metod pomocniczych tworzące IObservable z Subscription OnNext() OnNext() 2 tablic, list, zdarzeń, ….) OnNext() Subskrybujemy client przekazując nasz obserwator (IObserver) lub odpowiednie delegacje. Wykonujemy „Dispose” na subskrypcji której dłużej nie potrzebujemy
  22. 22. Do dzieła….
  23. 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. 24. Observables (1) OnComplete d Observable.Empty<int>() new int[0] OnNext new int[]{777} Observable.Return(777) Iterator OnError rzuca Observable.Throw<int>(new Exception Exception("msg")) Iterator zawiesił się Observable.Never<int>() OnNext OnNext Enumerabl e.Range Observable.Range(0,2) (0,2)
  25. 25. Observables (2) Observable.Interval ( Nowa wartość co TimeSpan.FromMilliseconds 100 ms (100)); for(int Observable.Generate( i=0;i<10;i++) 0, yield return i; // dostępne i => i < 10, również i => i + 1, // z opóźnieniem i => i); // czasowym • Przekazujemy Observable.Create<int>( delegatę o observer => patametrze { IObservable observer.OnNext( 77 ); • Działamy na observer.OnCompleted(); IObservable return ( () => { } ); • Zwracamy } ); delegatę dla Dispose I inne …
  26. 26. Do dzieła….
  27. 27. Ciepło – zimno, czyli zimne i ciepłe źródłaZimne – IObservable<T> Subscription 0, 1, 2, 3, … 1zawsze te Subscription 0, 1, 2, 3, … 2same dane Subscribe() clientposubskrypcji IObservable<T>Ciepłe – Subscription Mouse Events [x1,y1] [x2,y2] … 1zawsze Subscription 2 [x2,y2] [x3,y3] …aktualne dane client Subscribe()
  28. 28. Zdarzenia w .NET nibypożyteczne, łatwe, ale… Jak przekazywać? Ukryte źródło danych myForm.MouseMove += (sender, args) => { Jak filtrować? if (args.Location.X == args.Location.Y) // chcę wywołać inne zdarzenie Jak obsługiwać Jak komponować błędy ?? }. zdarzenia? myForm.MouseMove -= /* a co tutaj?? */ Co z uwalnianiem zasobów?
  29. 29. … obserwowanie jest lepsze Źródło punktów IObservable<Point> mouseMoves = Observable.FromEventPattern<MouseEventArgs Obiekty można >przekazywać (this, "MouseMove" ) Łatwo można filtrować .Select( ev => ev.EventArgs.Location ); Są inne operatory var filtered = mouseMoves pozwalające .Where(pos => pos.X == pos.Y); na kompozycję var subscription = filtered.Subscribe ( …) Łatwo zwalniamy Subscription.Dispose(); zasoby
  30. 30. Operatory LINQ na IObservableIObservable<T> IObservable<T> Where Skip Take Select
  31. 31. Komponowanie strumieni… --A--A--A--| Amb Amb --A--A--A--| ----B--B--B--| --A--A--A--| Concat -----------B--B--B--| Concat --A--A--A--B--B--B--| SelectMany --A--B--C--| SelectMany -(AX)(AY)(BX)(BY) --X--Y--Z--| (AZ)(CX)(BZ)(CY)(CZ)| Merge -A--B--C---| Merge --AX-BY-CZ--| --X--Y--Z--| Zip -A--B--C---| Zip -(AX)-(BY)-(CZ)--| --X--Y--Z--| CombineLatest-A----B--C--|CombineLates -(AU)(AW)(BX)(BY)(CZ)| -UWXYZ--| t ForkJoin -A----B--C--| -----------(CZ)--| ForkJoin -UWXYZ--|
  32. 32. Do dzieła….
  33. 33. Tematy (Subject) Subject może być IObservable<T IObservable<T obserwowany (jest > > IObservable) OnNext OnNext OnNext OnNext Subject jest obserwatorem (jest IObserver) Wariacje: Subject  ReplaySubject: - oferuje pełną OnNext OnNext OnNext OnNext historię  AsyncSubject – oferuje to co zostało wrzucone na końcu i kończy się  BehaviorSubject: podobnie jak Client ReplaySubject ale z pamięcią 1 elementu.
  34. 34. Do dzieła….
  35. 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) > Beginners Guide to Reactive Extensions for .NET (http://msdn.microsoft.com/en- us/data/gg577611) a zwłaszcza Design Guidelines.
  36. 36. Podsumowanie
  37. 37. Rule Financial - szuka C# developer Senior C# developer Developer .NET/Silverlight http://www.rulefinancial.com/careers/global- vacancies.aspx
  38. 38. Dziękuję za uwagę. Pytania?

×