मैं कुछ आरएक्स का उपयोग कर कोड है, एक से अधिक थ्रेड से कहा जाता है कि करता है का उपयोग कर OnNext Rx में कॉल:बचना ओवरलैपिंग जब SubscribeOn (Scheduler.TaskPool)
subject.OnNext(value); // where subject is Subject<T>
मैं चाहता हूँ मूल्यों पृष्ठभूमि में प्रोसेस किया है, इसलिए मेरी सदस्यता
subscription = subject.ObserveOn(Scheduler.TaskPool).Subscribe(value =>
{
// use value
});
मैं वास्तव में परवाह नहीं है जो धागे नमूदार से बाहर आने के मानों का प्रबंधन, जब तक काम TaskPool में डाल दिया है और मौजूदा धागा ब्लॉक नहीं करता है। हालांकि, मेरे ऑननेक्स्ट प्रतिनिधि के अंदर 'मूल्य' का उपयोग थ्रेड सुरक्षित नहीं है। फिलहाल, अगर अवलोकन के माध्यम से बहुत सारे मूल्य चल रहे हैं तो मुझे अपने ऑननेक्स्ट हैंडलर को ओवरलैपिंग कॉल मिल रही हैं।
मैं अपने ऑननेक्स्ट प्रतिनिधि को केवल एक लॉक जोड़ सकता हूं, लेकिन यह चीजों को करने का आरएक्स तरीका नहीं लगता है। यह सुनिश्चित करने का सबसे अच्छा तरीका क्या है कि मेरे पास केवल एक ही समय में मेरे ऑननेक्स्ट हैंडलर को एक कॉल है, जब मेरे पास subject.OnNext(value);
पर कॉल करने वाले एकाधिक थ्रेड हैं?
'सिंक्रनाइज़' करने के लिए कॉल 'ObserveOn' पर कॉल से पहले होना चाहिए अन्यथा आप 'ObserveOn' के लिए समवर्ती अनुबंध का उल्लंघन कर रहे हैं। लेकिन हकीकत में यदि उपयोग का मामला कई धागे के बीच एक विषय साझा कर रहा है, तो सबसे अच्छा समाधान विषय को सिंक्रनाइज़ करने के बजाय विषय को सिंक्रनाइज़ करना है: 'var syncSubject = Subject.Synchronize (syncSubject); 'अब' syncSubject 'को हाथ दें आपके निर्माता धागे के लिए और वे मूल विषय के ग्राहकों के साथ समस्याएं पैदा किए बिना 'syncSubject.OnNext()' को कॉल कर सकते हैं। – Brandon
@ ब्रैंडन var syncSubject = विषय.Synchronize (syncSubject); ... आप इसे आवंटित करने से पहले एक चर का उपयोग कर रहे हैं, क्या आप इसे स्पष्ट कर सकते हैं? – Beachwalker
@ बेचवाल्कर जो एक टाइपो है।उत्तर में दिखाए गए अनुसार सिंक्रनाइज़ करने के लिए तर्क के रूप में इसे 'विषय' होना चाहिए – Brandon