2012-01-07 17 views
5

का उपयोग कर जब मैंक्रॉस धागा अपवाद RX थ्रॉटल

अमान्य पार धागा पहुँच हो रही है।

RX थ्रॉटल

का उपयोग करते समय यहाँ मेरी कोड है:

 yObs.SubscribeOnDispatcher() 
      .DistinctUntilChanged() 
      .Throttle(TimeSpan.FromMilliseconds(33)) 
      .SkipWhile(y => !_isDragging) 
      .Subscribe(y => 
          { 
           // Exception when trying to access image 
           image.RenderTransform = new CompositeTransform() { TranslateY = -y }; 
           _vm.UpdateContentDrag(y/image.ActualHeight * 100); 
          }); 

लेकिन अगर मैं छोड़ थ्रोटल सब कुछ काम करता है।

जहां तक ​​मुझे लगता है कि थ्रॉटल थ्रेड पूल का उपयोग करता है, इसलिए यूएन थ्रेड पर ऑननेक्स्ट नहीं होता है। लेकिन SubscribeOnDispatcher इसे यूआई थ्रेड पर वापस मार्शल करना चाहिए। क्या यह नहीं होना चाहिए?

उत्तर

12

SubscribeOnDispatcher बारे में आपकी समझ सही नहीं है। सबसे पहले, आइए ऑपरेटरों पर दो * के बीच अंतर करें:

  • सदस्यता लें * - निर्दिष्ट शेड्यूलर पर (un) सदस्यता तर्क चलाता है। जब तक आप Observable.Create आदि के साथ खेलते हैं, तब तक शायद ही कभी इस्तेमाल किया जाता है।
  • ObserveOn * - निर्दिष्ट शेड्यूलर पर पर्यवेक्षक संदेश (ऑननेक्स्ट, ऑनरर, ऑनकंपलेट) चलाता है। सब्सक्राइब करने के लिए "इवेंट हैंडलर" चलाते समय अधिकतर यूआई सिंक्रनाइज़ेशन के लिए उपयोग किया जाता है।

अपने नमूने को काम करने के लिए, आपको ऑब्जर्वऑन ऑपरेटर को क्वेरी में आगे की धारा का उपयोग करने के लिए भी चिपकना चाहिए। हमारी सिफारिश अंतिम सदस्यता कॉल के सामने ऐसा करना है। क्वेरी के भीतर, थ्रॉटल जैसे ऑपरेटर द्वारा समेकन शुरू किया जा सकता है (जिसका डिफ़ॉल्ट शेड्यूलर थ्रेड पूल है)। केवल उस बिंदु पर आपको सिंक्रनाइज़ेशन गारंटी की आवश्यकता है, ऑपरेटर पर * परिचय दें।

थ्रॉटल कॉल को पैरामीटर करने के लिए पॉल का सुझाव भी एक अच्छा है। ऐसे मामलों में जहां आप पेश की गई सभी समेकन को नियंत्रित कर सकते हैं, आप ऐसा करना चाहेंगे। हालांकि, ऐसे कई मामले हैं जहां आपको एक IOervervable अनुक्रम दिया जाता है जो सिंक्रनाइज़ेशन आवश्यकताओं के संबंध में बुरा व्यवहार करता है, * ऑपरेटर पर * उपयोग की आवश्यकता होती है।

4

बस लाइन के लिए बदलने के लिए:

.Throttle(TimeSpan.FromMilliseconds(33), DispatcherScheduler.Instance) 

यह और अधिक कुशल वैसे भी है (हालांकि 33ms एक बहुत कम समयावधि थ्रोटल है, टाइमर संकल्प के खिलाफ मार)

+0

धन्यवाद, यह भी काम करता है। – Vitalij

संबंधित मुद्दे