Professional Documents
Culture Documents
Wprowadzenie Do Reactive Extensions Dla
Wprowadzenie Do Reactive Extensions Dla
IObservable<T>
OnNext()
wiele metod pomocniczych
tworzące IObservable z
tablic, list, zdarzeń, ….) OnNext()
Subscription 2 OnNext()
OnNext()
Subskrybujemy przekazując
nasz obserwator client
(IObserver) lub
odpowiednie delegacje.
Wykonujemy „Dispose” na
subskrypcji której dłużej nie
potrzebujemy
Do dzieła….
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
Observables (1)
OnCompleted
Observable.Empty<int>() new int[0]
Exception("msg"))
Iterator
zawiesił się
Observable.Never<int>()
OnNext OnNext Enumerable
Observable.Range(0,2) .Range (0,2)
Observables (2)
Observable.Interval ( Nowa wartość co
TimeSpan.FromMilliseconds (100)); 100 ms
Observable.Generate(
for(int i=0;i<10;i++)
0,
yield return i;
i => i < 10, // dostępne również
i => i + 1, // z opóźnieniem
i => i); // czasowym
Observable.Create<int>( • Przekazujemy
observer => delegatę o
{ patametrze
observer.OnNext( 77 ); IObservable
observer.OnCompleted(); • Działamy na
return ( () => { } ); IObservable
} ); • Zwracamy
delegatę dla
I inne … Dispose
Do dzieła….
Ciepło – zimno, czyli zimne i ciepłe źródła
Zimne –
IObservable<T>
Subscription 1 0, 1, 2, 3, …
Ciepłe –
IObservable<T>
Subscription 1 [x1,y1] [x2,y2] …
Mouse Events
zawsze Subscription 2 [x2,y2] [x3,y3] …
aktualne dane client
Subscribe()
Zdarzenia w .NET niby pożyteczne, łatwe,
ale…
myForm.MouseMove -= /* a co tutaj?? */
Co z uwalnianiem zasobów?
… obserwowanie jest lepsze Źródło
punktów
IObservable<Point> mouseMoves =
Observable.FromEventPattern<MouseEventArgs>
Obiekty (this, "MouseMove" )
można
przekazywać .Select( ev => ev.EventArgs.Location );
Łatwo można
filtrować
var filtered = mouseMoves
.Where(pos => pos.X == pos.Y); Są inne
operatory
pozwalające na
var subscription = filtered.Subscribe ( …) kompozycję
Subscription.Dispose();
Łatwo
zwalniamy
zasoby
Operatory LINQ na IObservable
IObservable<T>
IObservable<T>
Where Skip Take Select
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--|
CombineLatest -(AU)(AW)(BX)(BY)(CZ)|
-UWXYZ--|
OnNext
OnNext
OnNext
OnNext
IObserver)
Wariacje:
ReplaySubject: - oferuje pełną Subject
historię
OnNext
OnNext
OnNext
OnNext
AsyncSubject – oferuje to co
zostało wrzucone na końcu i kończy
się
BehaviorSubject: podobnie jak
ReplaySubject ale z pamięcią 1 Client
elementu.
Do dzieła….
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.
Podsumowanie
Dziękuję za uwagę.
Pytania?