बस सुरक्षित होने के लिए मैं इस पैटर्न का उपयोग अब से करूँगा। मैं शायद विस्तार विधियों के माध्यम से काम करने के लिए संशोधित करूँगा लेकिन सिद्धांत ध्वनि है। सुनिश्चित करें कि आप सदस्यता तो मैं मुक्त करने के लिए SizeChangedObserver() और UnloadedObserver() पाने के बजाय आप उन्हें ड्रॉप करने
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());
}
}
नोट मैं स्वचालित रूप से उत्पन्न विस्तार के तरीकों के साथ RX FromEventPattern लपेटकर कर रहा हूँ चाहते रिसाव नहीं है होना करने के लिए FromEventPattern के प्रारूप को याद रखना मुश्किल है।
रैपिंग कोड इस तरह के
public static IObservable<EventPattern<RoutedEventArgs>> UnloadedObserver(this FrameworkElement This){
return Observable.FromEventPattern<RoutedEventHandler, RoutedEventArgs>(h => This.Unloaded += h, h => This.Unloaded -= h);
}
ऊपर पैटर्न के रूप में उत्पन्न होता है शायद IDisposable दृश्य मॉडल निकल करने के साथ ही इस्तेमाल किया जा सकता।
आम तौर पर यदि प्रकाशक का जीवनकाल ग्राहक के जीवनकाल से समान या छोटा होता है तो आपको फॉर्म बंद होने पर ईवेंट हैंडलर को हटाना नहीं पड़ता है।उदाहरण के लिए ReactiveCommand पर एक ही सिद्धांत लागू होता है? – KolA
@ कोला - मैं सुझाव दूंगा कि आप सभी आरएक्स सदस्यता का स्पष्ट रूप से निपटान करते हैं यदि आप जानते हैं कि कुछ अभी भी सुरक्षित होने के लिए चल रहे हैं। एक फॉर्म-लेवल 'कंपोजिट डिस्पोजेबल' होना पर्याप्त है जो आप सभी सब्सक्रिप्शन ट्रैक करते हैं। इसका अर्थ यह है कि जब आप बाहर निकलते हैं तो केवल एक ही 'डिस्प्ले()' का उपयोग करें। नियमित घटनाओं की तरह, आप ऐसा करने के बिना दूर हो सकते हैं लेकिन यह हमेशा मामला नहीं है। – Enigmativity