Crearé un observable (a través de una variedad de medios) y se lo devolveré a las partes interesadas, pero cuando hayan terminado de escuchar, me gustaría eliminar lo observable para que no continúe consumiendo recursos. Otra forma de pensar que es crear temas en un sistema secundario de pub. Cuando ya nadie está suscrito a un tema, ya no desea mantener el tema y su filtrado.¿Cómo puedo crear un observable Rx que deje de publicar eventos cuando el último observador cancela la suscripción?
6
A
Respuesta
10
Rx ya cuenta con un operador para que se adapte a sus necesidades - y dos en realidad - Publish
& RefCount
.
Aquí es cómo usarlos:
IObservable xs = ...
var rxs = xs.Publish().RefCount();
var sub1 = rxs.Subscribe(x => { });
var sub2 = rxs.Subscribe(x => { });
//later
sub1.Dispose();
//later
sub2.Dispose();
//The underlying subscription to `xs` is now disposed of.
simple.
1
Si he entendido su pregunta, quiere crear la observable de modo que cuando todos los suscriptores hayan eliminado su suscripción, es decir, no haya más suscriptores, entonces quiera ejecutar una función de limpieza que detendrá los valores observables de producción . Si esto es lo que quieres, entonces se puede hacer algo, como a continuación: Ejemplo de
//Wrap a disposable
public class WrapDisposable : IDisposable
{
IDisposable disp;
Action act;
public WrapDisposable(IDisposable _disp, Action _act)
{
disp = _disp;
act = _act;
}
void IDisposable.Dispose()
{
act();
disp.Dispose();
}
}
//Observable that we want to clean up after all subs are done
public static IObservable<long> GenerateObs(out Action cleanup)
{
cleanup =() =>
{
Console.WriteLine("All subscribers are done. Do clean up");
};
return Observable.Interval(TimeSpan.FromSeconds(1));
}
//Wrap the observable
public static IObservable<T> WrapToClean<T>(IObservable<T> obs, Action onAllDone)
{
int count = 0;
return Observable.CreateWithDisposable<T>(ob =>
{
var disp = obs.Subscribe(ob);
Interlocked.Increment(ref count);
return new WrapDisposable(disp,() =>
{
if (Interlocked.Decrement(ref count) == 0)
{
onAllDone();
}
});
});
}
// Uso:
Action cleanup;
var obs = GenerateObs(out cleanup);
var newObs = WrapToClean(obs, cleanup);
newObs.Take(6).Subscribe(Console.WriteLine);
newObs.Take(5).Subscribe(Console.WriteLine);
Cuestiones relacionadas
- 1. Eliminación observable de la suscripción observable
- 2. Agregando una secuencia observable después de la suscripción
- 3. ¿Cómo estrangular la secuencia de eventos con RX?
- 4. Publicar publicar eventos
- 5. ¿Cómo obtengo un IObservable para enviar el último valor al momento de la suscripción?
- 6. Eventos de suscripción en VB.NET
- 7. Patrón de observador: cuando a
- 8. Ejemplo super simple de C# observador/observable con delegados
- 9. Manejo de errores en una secuencia observable usando Rx
- 10. Crear un observador de evento para el enfoque?
- 11. ¿Cómo proporciono el último valor de un elemento observable en caliente? Suscríbase
- 12. Diferencia entre observable en frío en RX y normal Enumerable
- 13. Cómo completar un Rx Observable dependiendo de una condición en un evento
- 14. Rx Marco: ejecutar una acción en tiempo de espera sin interrumpir la secuencia original, observable
- 15. ¿Cómo evitar métodos anónimos en la suscripción de eventos "dinámicos"?
- 16. Procesar eventos del Registro de eventos y reaccionar en un determinado patrón (Rx?)
- 17. No se puede modificar la respuesta en un observador de eventos Magento, aunque el observador está disparando
- 18. Ventajas de .NET Rx sobre eventos clásicos?
- 19. Cómo convertir un botón WPF. Haga clic en Evento en Observable usando Rx y F #
- 20. ¿Cómo puedo decirle a ReSharper que deje de crear campos de solo lectura?
- 21. ¿Cómo crear una matriz observable con deshacer?
- 22. ¿Cuál es la mejor manera de hacer observador/observable en Object-C (versión iphone)
- 23. evitando la superposición OnNext llama en Rx cuando se utiliza SubscribeOn (Scheduler.TaskPool)
- 24. ¿Hay un método Rx para repetir el valor anterior periódicamente cuando no hay valores entrantes?
- 25. ¿Debo anular la suscripción a todos los controladores de eventos?
- 26. WCF: deje que el cliente elija el formato de devolución
- 27. En Meteor, ¿cómo puedo crear un controlador de eventos genérico?
- 28. Rx para observar la propiedad cambió con eventos de acción
- 29. ¿Cómo puedo hacer que una UITableView deje de desplazarse
- 30. Anular la suscripción a eventos de EventAggregator en ViewModels