11

मैं इस वापसी प्रकार के साथ एक विधि है:async enumerables को कैसे सम्मिलित करें?

public async Task<IEnumerable<T>> GetAll() 

यह कुछ आगे async कॉल (अज्ञात नंबर), जिनमें से प्रत्येक गणनीय टी के एक कार्य वापसी बनाता है, और फिर वापसी के लिए परिणाम concat करना चाहता है।

var data1 = src1.GetAll(); 
var data2 = src2.GetAll(); 
var data3 = src3.GetAll(); //and so on 

अब यह काफी आसान सभी का इंतजार करने के लिए और परिणाम concat एकल गणनीय निर्माण करने के लिए, लेकिन मैं चाहता हूँ गणनीय फोन करने वाले/प्रगणक के लिए संभावित प्रतीक्षा करता है के साथ, जैसे ही पहली कॉल रिटर्न के रूप में उपलब्ध होने की यदि उपलब्ध परिणाम समाप्त होने पर कोई कॉल अभी भी लंबित है।

क्या मुझे <> किसी कार्य में लपेटने पर गणनाकर्ता समर्थन की कमी के आसपास काम करना है, इसके लिए मुझे एक कॉन्सैट सौंपना है? या टीपीएल या अन्य जगहों पर पहले से ही एक पुस्तकालय कॉल है जो मेरी मदद कर सकता है। मैंने आईएक्स को देखा, लेकिन यह अभी भी प्रयोगात्मक रिलीज पर है और इसे फोल्ड नहीं करना चाहते हैं।

एक तरफ नोट पर, क्या मैं एक विरोधी पैटर्न की कोशिश कर रहा हूं? मैं एक जटिलता, अपवाद हैंडलिंग के बारे में सोच सकता हूं - कॉलर की तरफ से, कॉल सफलतापूर्वक पूरा हो सकता है और वह गणना करने के लिए शुरू कर देता है लेकिन यह उस माध्यम से मिडवे उड़ सकता है ...

+0

(एक साइड नोट के रूप में) आपका पैटर्न असममित प्रतीत होता है: कोड पहले अनुक्रम के लिए तैयार है, लेकिन बाकी के लिए इंतजार नहीं करता है। – Vlad

+5

शायद आपको वास्तव में 'IObservable ' की आवश्यकता है? उस स्थिति में आप केवल ['Observable.Concat'] (https://msdn.microsoft.com/en-us/library/system.reactive.linq.observable.concat%28v=vs.103%29.aspx का उपयोग कर सकते हैं)। – Vlad

+0

@Vlad: अच्छा बिंदु। मैंने इसके बारे में सोचा जब मैंने आईएक्स/आरएक्स में देखा और मैं सहमत हूं, इस प्रकार के उपयोग के मामले में प्रतिक्रियाशील प्रतिक्रियाशील होती है। लेकिन समग्र परिदृश्य और अनुप्रयोग एक पुल आधारित है और मैं आरएक्स हथौड़ा में केवल अवलोकन योग्य परिणाम से गणना करने के लिए नहीं छोड़ना चाहता हूं। – Vivek

उत्तर

6

Async Enumerable नामक एक मौजूदा प्रोजेक्ट है जो उत्तर वास्तव में यह समस्या है।

आप इसे आसानी से उपयोग करने के लिए रख सकते हैं।

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

IAsyncEnumerable<string> GetAsyncAnswers() 
{ 
    return AsyncEnum.Enumerate<string>(async consumer => 
    { 
     foreach (var question in GetQuestions()) 
     { 
      string theAnswer = await answeringService.GetAnswer(question); 
      await consumer.YieldAsync(theAnswer); 
     } 
    }); 
} 

यह एक IAsyncEnumerable<string> जो एक बार GetAnswer रिटर्न अर्जित करता उजागर करता है। आप आंतरिक रूप से IAsyncEnumerable<T> को अपने मामले में बेनकाब कर सकते हैं और आंतरिक रूप से GetAll के अंदर कॉल कर सकते हैं।

क्या मैं विरोधी पैटर्न की कोशिश कर रहा हूं? मैं एक जटिलता, अपवाद हैंडलिंग के बारे में सोच सकते हैं - फोन करने वाले की ओर से, कॉल सफलतापूर्वक पूरा कर सकते हैं और वह गणनीय का उपयोग शुरू, लेकिन यह है कि के माध्यम से रास्ते के मध्य में उड़ा सकते हैं ...

मैं नहीं होगा ऐसा बोलो। इसमें संभावित रूप से समस्याओं में से एक के दौरान आंतरिक रूप से होने वाली अपवाद जैसी समस्याएं हैं, लेकिन यह संभावित किसी भी IEnumerable<T> के अंदर हो सकती है। उभरते एसिंक एपीआई की आज की वास्तविकता में असीमित अनुक्रमों की आवश्यकता है।

+1

धन्यवाद। उत्तर के रूप में चिह्नित। मैंने पुस्तकालय आयात नहीं किया, लेकिन अगले नमूने प्राप्त करने के लिए एक funcenator लेने के माध्यम से, अपने नमूना के लिए एक ही दो लाइनों में अपने स्वयं के रोलिंग द्वारा समाप्त किया। यदि मैं व्यापक उपयोग केस प्राप्त करता हूं तो शायद मैं लाइब्रेरी पर एक और नज़र डालूंगा। – Vivek

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