Solo para estar seguro, voy a utilizar este patrón a partir de ahora. Probablemente voy a modificar para trabajar a través de métodos de extensión, pero el principio es el sonido. Para asegurarse de que no se escapan suscripciones que desea dejarlos
class Mesh2D{
public Mesh2D()
{
DisposeOnUnload(CreateBindings());
}
// Register all disposables for disposal on
// UIElement.Unload event. This should be
// moved to an extension method.
void DisposeOnUnload(IEnumerable<IDisposable> disposables)
{
var d = new CompositeDisposable(disposables);
var d2 = this.UnloadedObserver()
.Subscribe(e => d.Dispose());
var d3 = this.Dispatcher.ShutdownStartedObserver()
.Subscribe(e => d.Dispose());
d.Add(d2);
d.Add(d3);
}
// Where your bindings are simply yielded and
// they are removed on Unload magically
IEnumerable<IDisposable> CreateBindings()
{
// When the size changes we need to update all the transforms on
// the markers to reposition them.
yield return this.SizeChangedObserver()
.Throttle(TimeSpan.FromMilliseconds(20), RxApp.DeferredScheduler)
.Subscribe(eventArgs => this.ResetImageSource());
// If the points change or the viewport changes
yield return this.WhenAny(t => t.Mesh, t => t.Viewport, (x, t) => x.Value)
.Throttle(TimeSpan.FromMilliseconds(20), RxApp.DeferredScheduler)
.Subscribe(t => this.UpdateMeshChanged());
}
}
Nota estoy envolviendo RX FromEventPattern con métodos de extensión generados automáticamente por lo que obtener SizeChangedObserver() y UnloadedObserver() de forma gratuita en lugar de el formato difícil de recordar de FromEventPattern.
El código de envoltura se genera como tal
public static IObservable<EventPattern<RoutedEventArgs>> UnloadedObserver(this FrameworkElement This){
return Observable.FromEventPattern<RoutedEventHandler, RoutedEventArgs>(h => This.Unloaded += h, h => This.Unloaded -= h);
}
el patrón anterior, probablemente, se podría utilizar para desenlazar IDisposable Ver modelos también.
Normalmente no tiene que quitar los controladores de eventos al cerrar el formulario si la duración del editor es igual o menor que el tiempo de vida del suscriptor.¿Se aplica el mismo principio a ReactiveCommand, por ejemplo? – KolA
@KolA - Yo sugeriría que elimine explícitamente todas las suscripciones de Rx si sabe que algunas podrían estar ejecutándose solo para estar seguras. Es bastante fácil tener un 'CompositeDisposable' a nivel de formulario que rastrea todas las suscripciones. Significa solo un '.Dispose()' al salir. Al igual que los eventos regulares, puede escaparse sin hacerlo, pero no siempre es así. – Enigmativity