560 likes | 674 Views
www.eneta.ee/foorum. Sissejuhatus Rx raamistikku. Juri Mulenko Sr. Software Engineer Symantec www.devclub.eu www.devclub.ee. Kava. Kaasaegsed rakendused “ push ” ja “pull” mudel Mis on Rx Observable Collections idee Millest Rx koosneb
E N D
Sissejuhatus Rx raamistikku JuriMulenko Sr. Software Engineer Symantec www.devclub.euwww.devclub.ee
Kava • Kaasaegsed rakendused • “push” ja “pull” mudel • Mis on Rx • ObservableCollections idee • Millest Rx koosneb • Mõnede primitiivide ja operatsioonide seletus • Konstrueerimine ja kasutus • Demo
Kaasaegsed rakendused • Veebi - põhised • Ajax • Integratsioon teiste teenustega • Pilvides
Kaasaegsed rakendused • Desktop/rich • Ei blokeeri kasutajat • Mitu paralleelset tegevust • Veebiteenused
Kaasaegsed rakendused • Enterprise • Desktop + veeb • Modulaarsus • Edasilükatud töö (deferredexecution) • ESB (Enterprise Service Bus)
Kaasaegsed rakendused • Interaktiivsus • Asünkroonsus • Parallel-töötlus • Sündmus-orienteeritud
Pull vs push Keskkond Rakendus • Pull Andmed Push
Kasutaja vaatest on Push • Äratuskell • Chat/IM rakendused • RSS lugeja • Sotsiaalvõrgustike “Wall/Updates” • Web streaming • Outlook kalender - meeldetuletaja
Tarkvaras on Push • Windows Message Loop • Driver interrupt • Http server push / Http streaming • MVC push (C annab andmed V-le) • Sündmus-orineeritud rakendused • fraud – detection • börsi reaalaja analüüs • Muu CEP (Complex Event Processing)
.NET’is on Push • Sündmused ja sündmuste töötlejad Event / EventHandler • Callback void DoSomething(…, Action callBack) • Async pattern BeginXXX / EndXXX WebRequest.BeginGetResponse / EndGetResponse
Mis on Rx ? (Reactive Extensions)
“Rx is a library for composing asynchronous and event-based programs using observable collections.” DevLabs
Rx idee • Sündmuste voog = andmete voog = andmetekollektsioon = sündmuste kollektsioon • Nt. hiir on lõpmatu koordinaatide kollektsioon
Mis on Observable collection? (Ilusjalihtneidee)
public interface IEnumerable<T> { IEnumerator<T> GetEnumerator(); } public interface IEnumerator<T> : IDisposable { T Current { get; } bool MoveNext(); void Reset(); }
interface IEnumerator<T> { T Current { get; } // gets the current element // same as TGetCurrent(); } interface IX<T> { voidSetCurrent(Tvalue); }
interface IEnumerator<T> { bool MoveNext(); } interface IX<T> { void SetCurrent(T value); voidMoveNext(boolmoreItems); }
interface IEnumerator<T> { bool MoveNext(); } interface IX<T> { void SetCurrent(T value); //void MoveNext(boolmoreItems); void Break(); }
interface IEnumerator<T> { bool MoveNext(); //or throws Excepton: //(bool | Exception) MoveNext(); } interface IX<T> { void SetCurrent(T value); void Break(); void Throw(Exception ex); }
interface IEnumerator<T> { T Current { get; } bool MoveNext(); void Reset(); } interface IX<T> { void SetCurrent(T value); void Break(); void Throw(Exception ex); }
interface IEnumerator<T> : IDisposable { T Current { get; } bool MoveNext(); } interface IObserver<T> { void OnNext(T value); void OnCompleted(); void OnError(Exception ex); }
interface IEnumerable<T> { IEnumerator<T>GetEnumerator(); } interface IX<T> { void Attach(IObserver<T> observer); }
interface IEnumerable<T> { IEnumerator<T>GetEnumerator(); } interface IX<T> { void Attach(IObserver<T> observer); void Detach(IObserver<T> observer); }
interface IEnumerable<T> { IEnumerator<T>:IDisposableGetEnumerator(); } interface IX<T> { IDisposableAttach(IObserver<T> observer); }
interface IEnumerable<T> { IEnumerator<T> GetEnumerator(); } interface IObservable<T> { IDisposableSubscribe(IObserver<T> observer); }
interface IObservable<T> { IDisposable Subscribe(IObserver<T> observer); } interface IObserver<T> { void OnNext(T value); void OnCompleted(); void OnError(Exception ex); }
Enumerables & Observables • Enumerable = pull • Observable = push • E ja O on duaalsed • LINQ!
IObserver<T> IObservable<T> Metainfo + Generators Concurrency LINQ Async pattern Events Custom
Rx versioonid • .NET 3.5 SP1 (k.a. Client Profile) • .NET 4.0 (k.a. Client Profile) • Silverlight 3 / 4 • XNA • Windows Phone 7 • JavaScript
Marble diagram aeg sündmus/andmed OnNext(T value) viga (exception)OnError(Exception error) lõppOnCompleted();
IObservable<T> Never() Empty() Return(T value) Thow()
IO<T>Concat (IO<T> x, IO<T> y) x y z var z = x.Concat(y);
IO<T> Merge (IO<T> x, IO<T> y) x y z var z = x.Merge(y);
IO<Z> Zip(IO<X> x, IO<Y> y, Func<X, Y, Z> f) x y f f f z var z = x.Zip(y, func);
IO<T> Catch (IO<T> x, IO<T> y) x y z var z = x.Catch(y);
IO<T> Throttle (IO<T> x, TimeSpants) x < ts > ts z var z = x.Throttle(ts);
Sündmusest var z = Observable.FromEvent<EventArgs>( textBox1, “TextChanged”); var z = Observable.FromEvent( h => textBox1.TextChanged += h, h => textBox1.TextChanged -= h);
Async pattern = BeginXXX / EndXXX Stream s = …; varfunc = Observable .FromAsyncPattern<byte[], int, int>( stream.BeginWrite, stream.EndWrite); //returns Func<byte[], int, int, IObservable<Unit>> var z = func(…);
Delegaatidest Func<int, string> del = (i) => i.ToString(); var z1 = del.ToAsync()(5); // del.ToAsync() returns Func<int, IObservable<string>> var z2 = Observable .FromAsyncPattern<int, string>( del.BeginInvoke, del.EndInvoke)(5); //samaBeginXXX / EndXXX
interface IObservable<T> { IDisposable Subscribe(IObserver<T> observer); } interface IObserver<T> { void OnNext(T value); void OnCompleted(); void OnError(Exception ex); }
ImplementeeridesIObserver<T> var z = Observable.FromEvent<EventArgs>( textBox1, “TextChanged”); public class MyObserver: IObserver<T> { public void OnNext(T value) {…}; public void OnCompleted(value){…}; public void OnError(Exception ex){…}; } IDisposable subscription = z.Subscribe(new MyObserver());
Anonüümsed meetodid var z = Observable.FromEvent<EventArgs>( textBox1, “TextChanged”); IDisposable subscription = z.Subscribe( //Action<EventArgs> OnNext (eventArgs) => { Console.Writeline(“OnNext”); }, //Action<Exception> OnError (error) => { Console.Writeline(error.Message); }, //Action OnCompleted () => { Console.Writeline(“OnCompleted”)} );