एक संक्षिप्त उत्तर है कि आरएक्स फ्रेमवर्क इस तरह एक पुनरावर्ती पद्धति का उपयोग कर पैदा observables का समर्थन नहीं करता है, इसलिए यह आसानी से नहीं किया जा सकता। Combine
ऑपरेशन जिसे F # अनुक्रमों के लिए उपयोग किया जाता है, कुछ विशेष हैंडलिंग की आवश्यकता होती है जो अवलोकन योग्य नहीं प्रदान करते हैं। आरएक्स फ्रेमवर्क शायद उम्मीद है कि आप Observable.Generate
का उपयोग कर observables उत्पन्न करेंगे और फिर उन्हें कार्रवाई करने के लिए LINQ प्रश्नों के लिए/एफ # गणना बिल्डर का उपयोग करें।
वैसे भी, यहाँ कुछ विचार कर रहे हैं -
सबसे पहले, आप Observable.Concat
साथ Observable.merge
को बदलने के लिए की जरूरत है। पहले एक, समानांतर में दोनों observables चलाता है, जबकि दूसरा पहले पैदावार पहले नमूदार से सभी मूल्यों और फिर दूसरी नमूदार से मूल्यों को पैदा करता है। इस परिवर्तन के बाद, स्निपेट कम से कम ~ 800 संख्याओं को स्टैक ओवरफ़्लो से पहले प्रिंट करेगा।
स्टैक ओवरफ़्लो का कारण यह है कि Concat
एक अवलोकन योग्य बनाता है जो Concat
पर कॉल करता है ताकि Concat
आदि को अन्य अवलोकन योग्य बनाया जा सके। इसे हल करने का एक तरीका कुछ सिंक्रनाइज़ेशन जोड़ना है। आप Windows फ़ॉर्म का उपयोग करके कर रहे हैं, तो आप Delay
संशोधित कर सकते हैं इतना है कि यह कार्यक्रम जीयूआई धागा (जो वर्तमान ढेर को छोड़ देता है) पर नमूदार।
type RxBuilder() =
member this.Delay f =
let sync = System.Threading.SynchronizationContext.Current
let res = Observable.Defer f
{ new IObservable<_> with
member x.Subscribe(a) =
sync.Post((fun _ -> res.Subscribe(a) |> ignore), null)
// Note: This is wrong, but we cannot easily get the IDisposable here
null }
member this.Combine (xs, ys) = Observable.Concat(xs, ys)
member this.Yield x = Observable.Return x
member this.YieldFrom (xs:IObservable<_>) = xs
ठीक से इसे लागू करने के, आप अपने खुद Concat
विधि है, जो काफी जटिल है लिखने के लिए होता है: यहाँ एक स्केच है। विचार यह होगा कि:
- Concat कुछ विशेष प्रकार उदा।
IConcatenatedObservable
- जब विधि रिकर्सिवली कहा जाता है आप
IConcatenatedObservable
संदर्भ एक दूसरे को
Concat
विधि इस श्रृंखला के लिए दिखेगा और वहाँ उदाहरण हैं जब की एक श्रृंखला पैदा हो जाएगी तीन वस्तुओं, यह मध्य एक को छोड़ देगा (हमेशा 2 की लंबाई की श्रृंखला रखने के लिए)।
यह स्टैक ओवरफ्लो उत्तर के लिए थोड़ा जटिल है, लेकिन यह आरएक्स टीम के लिए उपयोगी प्रतिक्रिया हो सकती है।
स्रोत
2011-05-28 19:35:29
यह आपकी रूचि रख सकता है: http://feedproxy.google.com/~r/FCode/~3/rDQbQHOROOw/reactive-extensions-v1010425.html –
क्या आपने नवीनतम आरएक्स बिल्ड में 'विस्तार' ऑपरेटर देखा है ? यह कुछ रिकर्सन परिदृश्य को संभालता है। –
आप पर्यवेक्षक कैसे लागू करेंगे। इस समस्या का विस्तार करें? क्या आपके पास विस्तार के अर्थशास्त्र को समझाते हुए कोई लिंक है? – Holoed