यदि अवलोकन योग्य हो - OnCompleted
या OnError
के साथ - तो सदस्यता पहले से ही आपके लिए निपटाई गई है। आप चलाते हैं तो आप के ऊपर है कि देखेंगे
var xs = Observable.Create<int>(o =>
{
var d = Observable.Return(1).Subscribe(o);
return Disposable.Create(() =>
{
Console.WriteLine("Disposed!");
d.Dispose();
});
});
var subscription = xs.Subscribe(x => Console.WriteLine(x));
:
इस कोड का प्रयास करें "निपटाई गई!" कंसोल पर लिखा जाता है जब सब्सक्रिप्शन को सदस्यता के बिना .Dispose()
पर कॉल करने की आवश्यकता होती है।
एक महत्वपूर्ण बात गौर करने योग्य कचरा कलेक्टर कभी नहीं नमूदार सदस्यता पर .Dispose()
कहता है, तो आप वे नहीं किया है अपनी सदस्यताओं की चाहिए निपटाने (या नहीं हो सकता है) स्वाभाविक रूप से समाप्त हो गया से पहले अपनी सदस्यता क्षेत्र से बाहर चला जाता है।
यह लो, उदाहरण के लिए:
var wc = new WebClient();
var ds = Observable
.FromEventPattern<
DownloadStringCompletedEventHandler,
DownloadStringCompletedEventArgs>(
h => wc.DownloadStringCompleted += h,
h => wc.DownloadStringCompleted -= h);
var subscription =
ds.Subscribe(d =>
Console.WriteLine(d.EventArgs.Result));
ds
नमूदार केवल ईवेंट हैंडलर को जोड़ देती है, जब यह एक सदस्यता है और केवल अलग होगा जब नमूदार पूर्ण करता है या सदस्यता का निपटारा किया जाता है। चूंकि यह एक ईवेंट हैंडलर है, अवलोकन करने योग्य कभी पूरा नहीं होगा क्योंकि यह अधिक घटनाओं की प्रतीक्षा कर रहा है, और इसीलिए घटना से अलग होने का एकमात्र तरीका है (उपरोक्त उदाहरण के लिए)।
जब आप एक FromEventPattern
नमूदार आप जानते हैं कि केवल कभी एक मान प्रदान करेंगे तो यह ईवेंट हैंडलर स्वचालित रूप से अलग करने की अनुमति के लिए सदस्यता लेने से पहले .Take(1)
विस्तार विधि को जोड़ने के लिए और फिर आप मैन्युअल रूप से के निपटान के लिए की जरूरत नहीं है बुद्धिमान है सदस्यता
तो जैसा :
var ds = Observable
.FromEventPattern<
DownloadStringCompletedEventHandler,
DownloadStringCompletedEventArgs>(
h => wc.DownloadStringCompleted += h,
h => wc.DownloadStringCompleted -= h)
.Take(1);
मुझे आशा है कि इस मदद करता है।
IMHO तथ्य यह है कि एक निपटाए वस्तु दायरे में है यह एक बुरा शैली बनाता है। क्या मैं कुछ भूल रहा हूँ? –
इसके द्वारा, क्या आपका मतलब यह है कि "डिस्पोजेबल" चर का निपटान किया जा सकता है यदि डिस्पोजेबल वैरिएबल से पहले मेरा ऑब्सर्जेबल आग लग जाती है? इस वस्तु का निपटान करने के लिए एक बेहतर पैटर्न क्या है? – Noob