2011-07-21 9 views
5

तो मैं आरएक्स पर पढ़ रहा हूं और इसे कठिन समय में परेशान कर रहा हूं। मेरे पास एक सिल्वरलाइट ऐप है जिसे एक विशिष्ट सेवा को असीमित रूप से 6 कॉल करने की आवश्यकता है। पुराने दिनों में, हम कॉल करने और अनुरोध के साथ प्रतिक्रिया से मेल खाने के लिए उपयोगकर्ता स्टेट/टोकन से पूछताछ करके इसे संभाल लेंगे क्योंकि उन्हें आदेश में वापस लौटने की गारंटी नहीं है। हालांकि, मुझे संदेह है कि आरएक्स इसे एक और अधिक सुरुचिपूर्ण तरीके से संभालता है। लेकिन मैं इसे काम नहीं कर सकता। यहाँ मैं अब तक राशि है ...सिल्वरलाइट और प्रतिक्रियाशील एक्सटेंशन का उपयोग करके एसिंक सेवा कॉल का प्रबंधन

myCollection.Add(new myObject(1)); 
myCollection.Add(new myObject(2)); 
myCollection.Add(new myObject(3)); 
myCollection.Add(new myObject(4)); 
myCollection.Add(new myObject(5)); 
myCollection.Add(new myObject(6)); 

foreach (var myItem in myCollection) 
{ 
    var myObservable = Observable.FromEventPattern<MyServiceMethodCompletedEventArgs> 
    (
     f => myServiceClient.MyServiceMethodCompleted += f, 
     f => myServiceClient.MyServiceMethodCompleted -= f 
    ).Take(1).ObserveOn(SynchronizationContext.Current); 

    myObservable.Subscribe 
    (
    s => 
    { 
     if (s.EventArgs.Error == null) 
     { 

     myItem.MyProperty = s.EventArgs.Result; 
     } 
    } 
    ); 

    myServiceClient.MyServiceMethodAsync(myItem); 
} 

मुझे आशा है कि आप मुझे क्या यहाँ प्राप्त करने के लिए कोशिश कर रहा हूँ देख सकते हैं ...

क्या मैं के साथ अंत के myObject के किया जा रहा है सभी है लौटने वाले पहले कॉल के परिणाम पर सेट करें।

मुझे यकीन है कि यह कुछ मूर्खतापूर्ण है लेकिन मैं अभी तक इसे समझने में सक्षम नहीं हूं।

धन्यवाद :)

उत्तर

4

Observable.FromEventPattern के बजाय Observable.FromAsyncPattern की कोशिश कर रहा पर विचार करें। सिल्वरलाइट (और फोन) में FromAsyncPattern का उपयोग करने के लिए एक चाल है क्योंकि BeginInvoke/EndInvoke जोड़ी सीधे सेवा प्रॉक्सी द्वारा प्रकट नहीं होती है। हालांकि, अगर आप सेवा प्रॉक्सी खुद के बजाय सेवा प्रॉक्सी के लिए इंटरफ़ेस का उपयोग, आप शुरू/अंत पैटर्न का उपयोग कर सकते हैं:

IMyService svc = new myServiceClient(); 
var svcObservable = Observable.FromAsyncPattern<T, MyServiceResultArgs> 
         (svc.BeginMyServiceMethod, svc.EndMyServiceMethod); 

अब, आप foreach (LINQ के साथ एक विरोधी पैटर्न) का उपयोग करने से स्विच कर सकते हैं इस प्रकार एक नमूदार और myCollection और सेवा अनुरोध के बीच SelectMany में अपने myCollection बनाने के लिए:

var requestResult = from myItem in myCollection.ToObservable() 
        from result in svcObservable(myItem) 
        select new {myItem, result}; 

requestResult.Subscribe(result => result.myItem.myProperty = result.result); 

एक सावधानी के अतिरिक्त शब्द: आप Silverlight में FromAsyncPattern इस तरह से उपयोग करते हैं, परिणाम एक पृष्ठभूमि पर वापस आ जाएगा धागा। आपको डिस्पैचर पर वापस जाने के लिए देखभाल करने की आवश्यकता होगी।

आप कार्रवाई में यह देखने के लिए, पिछले 20 मिनट की जाँच चाहते हैं या मेरे मिक्स प्रस्तुति की तो http://channel9.msdn.com/events/MIX/MIX11/EXT08 पर।

+0

धन्यवाद! यह काम करता है और बूट करने के लिए बहुत अच्छा लग रहा है :-) मैं सोच रहा हूं कि परिणामों को यूआई थ्रेड पर वापस मार्शल करने के लिए, क्या मैं सिर्फ अनुरोध करने के लिए अंतिम पंक्ति नहीं बदल सकता। Reultult.ObserveOn (सिंक्रनाइज़ेशन कॉन्टेक्स्ट.क्यूरेंट)। सदस्यता लें (...) ? – Senkwe

+0

हां पर ObserveOn। वैकल्पिक रूप से, यदि आप उपयुक्त सिस्टम का संदर्भ जोड़ते हैं। प्रतिक्रियाशील .??? थ्रेडिंग लाइब्रेरी, आप requestResult.ObserveOnDispatcher() का उपयोग कर सकते हैं। सदस्यता लें (...) –

+0

ग्रेट उत्तर - जैसे जिम अप्रत्यक्ष रूप से क्वेरी सिंटैक्स का उपयोग करके दिखाता है, कुंजी अनुरोध जारी करने के लिए SelectMany का उपयोग कर रहा है –

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