system.reactive - programming - programacion reactiva
¿Qué hacen las diversas implementaciones de ISubject y cuándo se utilizarán? (4)
Tengo una idea bastante buena de lo que hace la clase Sujeto y cuándo usarla, pero acabo de revisar la referencia del lenguaje en msdn y ver que hay varias otras implementaciones de objeto IS como:
- AsyncSubject
- Comportamiento
- ReplaySubject
Como la documentación es bastante delgada en el terreno, ¿cuál es el punto de cada uno de estos tipos y en qué situaciones los usaría?
A la luz de la última versión ( v1.0.2856.0 ) y para mantener esta pregunta actualizada, ha habido un nuevo conjunto de clases de materias:
FastSubject
, FastBehaviorSubject
, FastAsyncSubject
y FastReplaySubject
Según las v1.0.2856.0 ,
Son mucho más rápidos que los sujetos regulares pero:
- no desacople al productor y al consumidor con un IScheduler (limitándolos efectivamente a ImmediateScheduler);
- no proteger contra el desbordamiento de pila;
- no sincronizar mensajes de entrada
Los operadores de publicación y poda utilizan los temas rápidos si no se especifica ningún planificador.
En lo que respecta a AsyncSubject
Este codigo
var s = new AsyncSubject<int>();
s.OnNext(1);
s.Subscribe(Console.WriteLine);
s.OnNext(2);
s.OnNext(3);
s.OnCompleted();
imprime un solo valor 3. Y se imprime igual si la suscripción se mueve a una vez completada. Por lo tanto, no reproduce el primer elemento, sino el último, lo reproduce una vez completado (hasta que se completa, no produce valores), y no funciona como Asunto antes de completarse. Consulte esta discusión de Prune para obtener más información (AsyncSubject es básicamente lo mismo que Prune)
La respuesta de Paul casi lo clava. Hay algunas cosas que vale la pena agregar, sin embargo:
AsyncSubject funciona como dice Paul, pero solo después de que se completa la fuente . Antes de eso, funciona como Subject
(donde los suscriptores reciben valores "en vivo")
AsyncSubject ha cambiado desde la última vez que ejecuté pruebas contra él. Ya no actúa como un sujeto vivo antes de completarse, sino que espera su finalización antes de emitir un valor. Y, como menciona Sergey, devuelve el último valor, no el primero (aunque debería haberlo captado, ya que siempre ha sido así)
AsyncSubject es utilizado por Prune
, FromAsyncPattern
, ToAsync
y probablemente algunos otros
BehaviorSubject es utilizado por sobrecargas de Publish
que aceptan un valor inicial
ReplaySubject es utilizado por Replay
NOTA: Todas las referencias de operadores anteriores se refieren al conjunto de operadores de publicación tal como estaban antes de ser reemplazados por los operadores de publicación generalizados en rev 2838 (Christmas ''10), ya que se mencionó que los operadores originales se volverán a agregar.
Todos estos temas comparten una propiedad común: toman parte (o todo) de lo que se les publica a través de OnNext y lo graban y lo reproducen a usted, es decir, toman un observable y lo enfrían. Esto significa que si te suscribes a cualquiera de estos más de una vez (es decir, Suscríbete => Cancelar suscripción => Suscríbete nuevamente), verás al menos uno del mismo valor nuevamente.
ReplaySubject : cada vez que te suscribes al Asunto, obtienes el historial completo de lo que se ha vuelto a publicar, lo más rápido posible (o un subconjunto, como los últimos n elementos)
AsyncSubject : siempre reproduce el último elemento publicado y se completa, pero solo después de que se haya completado la fuente. Este tema es increíble para las funciones asíncronas, ya que puede escribirlas sin preocuparse por las condiciones de la carrera: incluso si alguien se suscribe después de que se completa el método asíncrono, obtienen el resultado.
BehaviorSubject : Algo así como ReplaySubject pero con un búfer de uno, por lo que siempre obtienes lo último que se publicó. También puede proporcionar un valor inicial. Siempre proporciona un elemento al instante en Suscribirse.