Qu'est-ce que LINQ to events a.k.a RX Framework?
-
10-07-2019 - |
Question
Qu'est-ce que LINQ pour les événements a.k.a RX Framework , autrement dit les extensions réactives de .NET 4.0 (mais également disponible en versions rétroportées)?
En d'autres termes, à quoi servent tous les éléments de System.Reactive.dll?
La solution
L'équipe .NET Rx (ce n'est pas un nom officiel) a constaté que toute séquence de push (événements, rappels) pouvait également être vue comme une séquence de pull (comme nous le faisons normalement lors de l'accès à des enumerables) & # 8211; ou ils sont doubles dans la nature. En bref, le modèle observateur / observable est le double du modèle de dénombrement.
Alors, qu'est-ce qui est cool dans cette dualité?
Tout ce que vous faites avec les séquences Pull (lire le codage de style déclaratif) est également applicable aux séquences Push. Voici quelques aspects. Vous pouvez créer des observables à partir d’événements existants, puis les utiliser comme citoyens de première classe dans .NET & # 8211; c'est-à-dire que vous pouvez créer un observable à partir d'un événement et l'exposer comme une propriété.
IObservable étant le dual mathématique de IEnumerable, .NET Rx facilite les séquences LINQ au-dessus des séquences push comme les événements, un peu comme LINQ sur IEnumerables
Cela donne une plus grande liberté pour composer de nouveaux événements & # 8211; vous pouvez créer des événements spécifiques à partir d'événements généraux.
.NET Rx introduit deux interfaces, IObservable et IObserver, qui "offrent une alternative à l’utilisation des adaptateurs d’entrée et de sortie en tant que producteur et consommateur de sources et de puits d’événements". et cela deviendra bientôt de facto l’écriture de code asynchrone de manière déclarative. Voici un exemple rapide.
//Create an observable for MouseLeftButtonDown
var mouseLeftDown=Observable.FromEvent<MouseButtonEventArgs>
(mycontrol,"MouseLeftButtonDown");
//Query the above observable just to select the points
var points = from ev in mouseEvents
select ev.EventArgs.GetPosition(this);
//Show points in the window's title, when ever user
//presses the left button of the mouse
points.Subscribe(p => this.Title = "Location ="
+ p.X + "," + p.Y);
Vous pouvez également passer par ces messages pour obtenir la tête et la queue en détail. Consultez également le code source associé.
- Partie I - Les extensions System.Reactive ou .NET Reactive (Rx) & # 8211; Concepts et premier regard
- Partie II - LINQ to Events - Plus d'informations sur les extensions .NET Reactive Extensions (Rx)
- Partie III - LINQ To Events - Génération de GetEventName ( ) Méthodes d'encapsulation utilisant des modèles de texte T4
Autres conseils
Vous pouvez en savoir plus à ce sujet ici: http://themechanicalbride.blogspot.com/2009/07 /introducing-rx-linq-to-events.html
Ma première exposition a été sur ce blog, alors que je lis son livre sur F #: http://tomasp.net/articles/reactive-ii-csevents.aspx
En fait, si je comprends bien, lorsque vous écrivez un gestionnaire d’événements pour les mouvements de la souris, par exemple, vous pouvez capturer en continu ces événements et peut-être compter le nombre de mouvements ou de clics, mais vous souhaitez d'utiliser cette information à plus d'un titre que comme un gestionnaire d'événements. Il suffit donc de traiter les événements comme un flux continu.
Découvrez également cette vidéo du canal 9: Expert à expert: Brian Beckman et Erik Meijer - À l'intérieur du .NET Reactive Framework (Rx)
D'après la description de l'émission:
Le .NET Reactive Framework (Rx) est le dual mathématique de LINQ pour Objets. Il consiste en une paire de interfaces IObserver / IObservable qui représenter basé sur push, ou observable, collections, plus une bibliothèque de méthodes d'extension qui implémentent la Opérateurs de requête standard LINQ et autre transformation utile du flux fonctions.
Je pense que l'essence du RX est de changer l'angle avec lequel nous examinons les informations. Naturellement, chaque information est le résultat d'un processus, qui se déroule dans le continuum espace-temps. L’approche traditionnelle fonctionne avec la projection du processus sur le plan temporel "actuel" / , en perdant les détails de la dimension temporelle.
RX utilise la projection dans une autre dimension, en capturant également le composant temps. Il n’est donc pas étonnant que LINQ to RX soit un sur-ensemble du LINQ classique.