मेरे पास एक उपयोगकर्ता इंटरैक्शन परिदृश्य है जिसे मैं आरएक्स के साथ संभालना चाहता हूं।आरएक्स और कार्य - नया कार्य शुरू होने पर चल रहे कार्य को रद्द करें?
परिदृश्य विहित के समान है "जब उपयोगकर्ता के टाइपिंग बंद कुछ काम करना" (आम तौर पर, क्या उपयोगकर्ता द्वारा अब तक टाइप किया है के लिए खोज) (1) - लेकिन मैं यह भी करने की जरूरत है:
- (2) केवल नवीनतम "ऐसा कुछ काम" इकाइयों के परिणामों की मिल (नीचे देखें)
- (3) जब काम की एक नई इकाई शुरू होता है, रद्द प्रगति में किसी भी काम (मेरे मामले में यह सीपीयू है गहन)
के लिए (1) मैं उपयोगकर्ता घटनाओं के लिए IObservable
का उपयोग करता हूं, .Throttle()
के साथ थ्रॉटल किया गया ताकि केवल ईवेंट ("उपयोगकर्ता टाइपिंग रोकता है") के बीच विरामों को ट्रिगर कर सके।
उस से, मैं .Select(_ => CreateMyTask(...).ToObservable())
।
यह मुझे IObservable<IObservable<T>>
देता है जहां प्रत्येक आंतरिक अवलोकन एक ही कार्य को लपेटता है।
प्राप्त करने के लिए (2) अंततः मैं काम की नवीनतम इकाई से परिणाम प्राप्त करने के लिए .Switch()
लागू करता हूं।
(3) - लंबित कार्यों को रद्द करने के बारे में क्या?
पिछले एक (रों) सेअगर मैं सही ढंग से समझ, जब भी वहाँ एक नया आंतरिक IObservable<T>
है, .Switch()
विधि यह की सदस्यता और सदस्यता समाप्त करने पर, उन्हें Dispose()
के कारण।
शायद इसे रद्द करने के लिए कार्य को ट्रिगर करने के लिए किसी भी तरह से तारित किया जा सकता है?
नहीं, मुझे कार्य का उपयोग करने की आवश्यकता नहीं है। यह सिर्फ एक में प्रसंस्करण-गहन कार्रवाई को समाहित करने के लिए प्राकृतिक महसूस किया। मैं आपके समाधान पर एक अच्छा नज़र डालेगा :) –
@ क्रिस्टीडायोनोस्को - ईमानदार होने के लिए मैं देख सकता हूं कि टीपीएल इसके लिए क्या चल रहा है, लेकिन मुझे हमेशा पता चला है कि आरएक्स का उपयोग करने के मेरे समाधान हमेशा ज्यादा स्वच्छ और बहुत अधिक अभिव्यक्तिपूर्ण होते हैं। मैं आरएक्स के पक्ष में टीपीएल से बचने की कोशिश करता हूं। – Enigmativity
यदि आप आरएक्स को गले लगा रहे हैं, तो आपकी प्रस्तावित 'स्टार्ट' विधि को 'स्टार्ट (फनक <रद्दीकरण टोकन, टी> काम)' के रूप में समझने में आसान बनाया जा सकता है और एक कस्टम डिस्पोजेबल के बजाय टोकन जेनरेट करने के लिए 'रद्दीकरण डिस्पोजेबल' का उपयोग करें। या, यदि आप वास्तव में * आरएक्स को गले लगाते हैं: 'स्टार्ट (Func, टी> काम) जहां आपकी' स्टार्ट 'विधि इसे' AsyncSubject' देती है, जब सदस्यता का निपटारा किया जाता है तो यह रद्दीकरण को संकेत देता है। 'Func ' बस आरसीए की भावना में घबराहट महसूस करता है। –
Brandon