2012-09-04 24 views
11

आरएक्स विषय के साथ, क्या यह OnNext() को कई धागे से कॉल करने के लिए थ्रेड-सुरक्षित है?प्रतिक्रियाशील एक्सटेंशन ऑननेक्स्ट

तो अनुक्रम एकाधिक स्रोत से उत्पन्न किया जा सकता है।

विलय के साथ एक ही काम करते हैं?

उत्तर

14

आरएक्स अनुबंध की आवश्यकता है कि अधिसूचना अनुक्रमिक हो, और कई ऑपरेटरों के लिए एक तार्किक आवश्यकता है। उस ने कहा, आप इस व्यवहार को प्राप्त करने के लिए उपलब्ध Synchronize विधियों का उपयोग कर सकते हैं।

 var subject = new Subject<int>(); 
     var syncedSubject = Subject.Synchronize(subject);    

अब आप syncedSubject को समवर्ती कॉल कर सकते हैं। एक पर्यवेक्षक जो सिंक्रनाइज़ किया जाना चाहिए के लिए, आप भी उपयोग कर सकते हैं:

 var observer = Observer.Create<Unit>(...); 
     var syncedObserver = Observer.Synchronize(observer); 

टेस्ट:

 Func<int, Action> onNext = i =>() => syncedSubject.OnNext(i); 
     Parallel.Invoke 
     (
      onNext(1), 
      onNext(2), 
      onNext(3), 
      onNext(4) 
     ); 
5

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

+0

यह एक उदाहरण सिंक्रनाइज़ विस्तार विधि का उपयोग प्रदान करने के लिए संभव है? – user1604006

4

कॉलिंग someSubject.OnNext()someList.Add() के रूप में थ्रेड-सुरक्षित के रूप में है - आप इसे 1 थ्रेड से कॉल कर सकते हैं, लेकिन समवर्ती रूप से नहीं। कथन में OnNext लपेटें और यह सुरक्षित रहेगा।

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