Έχουν δημοσιευτεί
Σάββατο, 27 Φεβρουαρίου 2010 2:06 μμ
από το μέλος
PALLADIN
Το Rx είναι το νέο δημιούργημα του Erik Meijer, και μετά από μήνες ενασχόλησης μαζί του, νομίζω ότι είναι απλά 'a work of genius'.
Αυτό που κάνει είναι να δρα ως compositional glue για events, asynchronous calls και γενικά για push based computations.
Κατεβάστε το από
εδώ και αρχίστε να εξερευνείτε τις δυνατότητές του (You will be amazed).
Ως ένα παράδειγμα της μαγείας του, έγραψα ένα κλασσικό mouse move recording and playback.
var mouseMoveObservable = Observable.Merge(new Control[] { this, recordButton, stopButton, playButton }
.Select(control => Observable.FromEvent<MouseEventArgs>(control, "MouseMove")));
ReplaySubject<TimeInterval<IEvent<MouseEventArgs>>> replayObservable = null;
Observable.FromEvent<EventArgs>(recordButton, "Click").ObserveOnWindowsForms().Subscribe(_ =>
{
stopButton.Enabled = true; recordButton.Enabled = false;
replayObservable = mouseMoveObservable.TimeInterval().Record();
replayObservable.ObserveOnWindowsForms().Subscribe(time => this.Text = String.Format("{0},{1}", time.Value.EventArgs.X, time.Value.EventArgs.Y));
});
Observable.FromEvent<EventArgs>(stopButton, "Click").ObserveOnWindowsForms().Subscribe(_ =>
{
replayObservable.Dispose();
stopButton.Enabled = false; playButton.Enabled = true;
});
Observable.FromEvent<EventArgs>(playButton, "Click").ObserveOnWindowsForms().Subscribe(_ =>
{
playButton.Enabled = false;
var playObservable = replayObservable.ToEnumerable()
.Aggregate(Observable.Return(new Unit()),
(accObservable, timeMouse) => accObservable.Delay(timeMouse.Interval)
.ObserveOnWindowsForms()
.Do(__ => Cursor.Position = ((Control)timeMouse.Value.Sender).PointToScreen(new Point(timeMouse.Value.EventArgs.X, timeMouse.Value.EventArgs.Y))));
playObservable.Subscribe(value => { }, () => recordButton.Enabled = true);
});