मैं एक अवलोकन योग्य (विभिन्न माध्यमों के माध्यम से) बनाउंगा और इसे इच्छुक पार्टियों को वापस कर दूंगा, लेकिन जब वे सुनते हैं, तो मैं अवलोकन को फाड़ना चाहता हूं ताकि संसाधनों का उपभोग जारी न रहे। एक पब सब सिस्टम में विषयों को बनाने के रूप में इसके बारे में सोचने का एक और तरीका। जब कोई भी विषय किसी और विषय की सदस्यता नहीं लेता है, तो आप विषय और उसके फ़िल्टरिंग को और अधिक नहीं पकड़ना चाहते हैं।मैं एक आरएक्स अवलोकन योग्य कैसे बना सकता हूं जो अंतिम पर्यवेक्षक सदस्यता रद्द करते समय प्रकाशन ईवेंट रोकता है?
6
A
उत्तर
10
आरएक्स पहले से ही आपकी आवश्यकताओं के अनुरूप करने के लिए एक ऑपरेटर है - अच्छी तरह से दो वास्तव में - Publish
& RefCount
।
यहाँ उनके उपयोग का तरीका बताया गया है:
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.
सरल।
1
यदि मैं आपका प्रश्न समझ गया हूं तो आप इस तरह के अवलोकन योग्य बनाना चाहते हैं कि जब सभी ग्राहकों ने अपनी सदस्यता का निपटारा किया हो यानी कोई और ग्राहक नहीं है, तो आप एक साफ अप फ़ंक्शन निष्पादित करना चाहते हैं जो उत्पादन से आगे के मूल्यों को देखने योग्य बनाएगा ।
//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();
}
});
});
}
// प्रयोग उदाहरण: इस यदि आप तो चाहते हैं कि आप नीचे की तरह कुछ कर सकते हैं
Action cleanup;
var obs = GenerateObs(out cleanup);
var newObs = WrapToClean(obs, cleanup);
newObs.Take(6).Subscribe(Console.WriteLine);
newObs.Take(5).Subscribe(Console.WriteLine);
संबंधित मुद्दे
- 1. आरएक्स - घटनाओं से सदस्यता रद्द करना
- 2. अवलोकन योग्य अवलोकन
- 3. नॉकआउट अवलोकन योग्य सदस्यता कैसे बनाएं जो केवल एक बार आग लगती है?
- 4. सदस्यता के बाद एक अवलोकन अनुक्रम जोड़ना
- 5. मैं एक संपादन योग्य यूनियन क्वेरी कैसे बना सकता हूं?
- 6. oauth करते समय मैं पॉपअप विंडो कैसे बना सकता हूं?
- 7. मैं इस .NET ईवेंट की सदस्यता कैसे ले सकता हूं?
- 8. नए अवलोकन योग्य
- 9. मैं पृष्ठ स्क्रॉलिंग ट्रिगर माउसओवर ईवेंट कैसे बना सकता हूं?
- 10. मैं सी # में ईवेंट सदस्यता कैसे साफ़ कर सकता हूं?
- 11. अवलोकन/पर्यवेक्षक एंड्रॉइड
- 12. अवलोकन योग्य
- 13. मैं multithreaded C++ में पर्यवेक्षक संबंध कैसे फाड़ सकता हूं?
- 14. मैं स्क्रॉल करने योग्य टैबबार कैसे बना सकता हूं ...?
- 15. मैं निष्पादन योग्य जावा प्रोग्राम कैसे बना सकता हूं?
- 16. एक इवेंट लिस्टनर एक अवलोकन योग्य है?
- 17. मैं निर्देशिका लिखने योग्य कैसे बना सकता हूं?
- 18. मैं क्लासलोडर कैसे बना सकता हूं जो कक्षा
- 19. मैं एक अवलोकन योग्य में दो आइटम कैसे स्वैप कर सकता हूं?
- 20. आरएक्सजेएस: अवलोकन और एकल पर्यवेक्षक की रिकर्सिव सूची
- 21. मैं एक constraintViolationException कैसे बना सकता हूं?
- 22. क्या मुझे सभी ईवेंट हैंडलर सदस्यता रद्द करनी चाहिए?
- 23. XML एक अवलोकन योग्य चयन
- 24. प्रेषक सदस्यता रद्द करने की सदस्यता
- 25. मैं एक रद्द करने योग्य घटना को कैसे कार्यान्वित करूं?
- 26. ईवेंट को डबल-क्लिक करते समय क्लिक/माउसअप ईवेंट रद्द करने की आवश्यकता है
- 27. मैं UILocalNotification कैसे बना सकता हूं जो हर दो मिनट
- 28. मैं एक विकेट यूआरएल कैसे बना सकता हूं जो इसके पैरामीटर को छुपाता है?
- 29. मैं जनरेटर से एक numpy सरणी कैसे बना सकता हूं?
- 30. सी # किसी दिए गए ईवेंट से सभी ईवेंट हैंडलर को कैसे सदस्यता रद्द करें?