Giusto per essere sicuro userò questo modello d'ora in poi. Probabilmente userò la modifica di tramite i metodi di estensione, ma il principio è valido. Per essere sicuri di non perdano abbonamenti si vuole far cadere loro
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 sto avvolgendo RX FromEventPattern con generate automaticamente metodi di estensione in modo da ottenere SizeChangedObserver() e UnloadedObserver() per libero piuttosto che il formato difficile da ricordare di FromEventPattern.
Il codice di incarto viene generato come tale
public static IObservable<EventPattern<RoutedEventArgs>> UnloadedObserver(this FrameworkElement This){
return Observable.FromEventPattern<RoutedEventHandler, RoutedEventArgs>(h => This.Unloaded += h, h => This.Unloaded -= h);
}
Il modello di cui sopra potrebbe probabilmente essere utilizzato per separare immagine modelli IDisposable pure.
In genere non è necessario rimuovere i gestori di eventi al termine del modulo se la durata del publisher è uguale o inferiore alla durata del sottoscrittore.Ad esempio, lo stesso principio si applica a ReactiveCommand? – KolA
@KolA - Suggerisco di disporre esplicitamente di tutte le sottoscrizioni Rx se si sa che alcuni potrebbero essere ancora in esecuzione solo per essere sicuri. È abbastanza facile avere un 'Form ComposableDisposable' a livello di modulo per monitorare tutte le sottoscrizioni. Significa solo un singolo '.Dispose()' quando esci. Come gli eventi regolari, potresti andartene senza farlo, ma non è sempre così. – Enigmativity