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
12 Przekształcamy … public interface IEnumerable
13 Przekształcamy … public interface IEnumerable
14 Przekształcamy … public interface IEnumerableDual
15 Przekształcamy … public interface IEnumerableDual
16 Przekształcamy … public interface IEnumerableDual
17 Przekształcamy … public interface IEnumerableDual
18 Przekształcamy … public interface IEnumerableDual
19 Poznajmy IObservable i IObserverpublic interface IObservable
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
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
25 Observables (2) Observable.Interval ( Observable.Generate(TimeSpan.FromMilliseconds (100)); Observable.Generate( 0, i => i < 10, i => i + 1, i => i); Observable.Create
26 Do dzieła….
27 Ciepło – zimno, czyli zimne i ciepłe źródłaZimne – zawsze te same dane po subskrypcji client IObservable
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
30 Operatory LINQ na IObservableIObservable
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
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?