2013-10-01 5 views
5

मेरे आवेदन में मैंने Scheduler.Default का उपयोग करने के लिए अपने सभी आरएक्स कोड लिखे हैं। मैं जानना चाहता था कि Scheduler.Default निर्दिष्ट करने के बीच कोई अंतर है और शेड्यूलर निर्दिष्ट नहीं है?System.Reactive.Concurrency.DefaultScheduler

System.Reactive.Concurrency.DefaultScheduler द्वारा नियोजित रणनीति क्या है?

उत्तर

7

आरएक्स प्लेटफार्म विशिष्ट प्लेटफार्म सर्विसेज पर निर्भर एक उपयुक्त रणनीति का उपयोग करता है जो लोड हो जाता है - इसलिए आप विभिन्न मामलों में एक अलग दृष्टिकोण प्राप्त कर सकते हैं। ओओबी कार्यान्वयन यह देखता है कि आपके प्लेटफ़ॉर्म पर थ्रेड उपलब्ध हैं या नहीं, और यदि आइटम शेड्यूल करने के लिए थ्रेड और प्लेटफ़ॉर्म टाइमर कार्यान्वयन का उपयोग करता है, अन्यथा यह कार्य का उपयोग करता है। उदाहरण के लिए, विंडोज 8 ऐप में बाद का मामला सामने आया। http://channel9.msdn.com/Shows/Going+Deep/Bart-De-Smet-Rx-20-RTM-and-RTW

जानकारी के लिए यहां देखो कैसे निर्मित ऑपरेटरों से व्यवहार करते हैं जब आप करते हैं और एक अनुसूचक निर्दिष्ट नहीं करते हैं के बारे में:

आप कैसे मंच सेवाओं निर्माता यहां से लागू किया जाता है के बारे में एक अच्छा वीडियो पा सकते हैं http://msdn.microsoft.com/en-us/library/hh242963(v=vs.103).aspx

5

हां Scheduler.Default निर्दिष्ट करने और शेड्यूलर निर्दिष्ट नहीं करने के बीच एक अंतर है। Scheduler.Defaultका उपयोग एसिंक्रोनस और संभवतः समवर्ती व्यवहार पेश करेगा, जबकि शेड्यूलर की आपूर्ति नहीं करने से ऑपरेटर के विवेकानुसार इसे छोड़ दिया जाएगा। कुछ ऑपरेटर सिंक्रनाइज़ निष्पादित करना चुनते हैं जबकि अन्य असीमित रूप से निष्पादित करेंगे, जबकि अन्य थ्रेड कूदने का विकल्प चुनेंगे।

यह संभवतः एक बुरा विचार है (प्रदर्शन और संभवतः यहां तक ​​कि शुद्धता के कारण भी बहुत अधिक सहमति आपको डेडलॉक स्थिति में ले जा सकती है) प्रत्येक आरएक्स ऑपरेटर को Scheduler.Default की आपूर्ति करने के लिए। यदि आपके पास कोई विशिष्ट शेड्यूलिंग आवश्यकता नहीं है, तो शेड्यूलर की आपूर्ति न करें और ऑपरेटर को जो चाहिए उसे चुनने दें।

उदाहरण के लिए,

इस तुल्यकालिक पूरा हो जाएगा:

int result = 0; 
Observable.Return(42).Subscribe(v => result = v); 
result == 42; 

जबकि इस (एक और धागा पर और अधिक संभावना) में अतुल्यकालिक पूरा हो जाएगा:

int result = 0; 
Observable.Return(42, Scheduler.Default).Subscribe(v => result = v); 
result == 0; 

// some time later 
result == 42; 
+1

शुक्रिया.लेकिन क्या हुआ अगर मैं चाहता हूँ परीक्षण उद्देश्यों के लिए एक टेस्टशेड्यूलर प्रदान करें? –