मैं समानांतर में एक संग्रह को संभालना चाहूंगा, लेकिन मुझे इसे लागू करने में परेशानी हो रही है और इसलिए मैं कुछ मदद की उम्मीद कर रहा हूं।
यदि मैं समानांतर # लूपडा के लैम्ब्डा के भीतर C # में async के रूप में चिह्नित एक विधि को कॉल करना चाहता हूं तो परेशानी पैदा होती है। उदाहरण के लिए:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
// some pre stuff
var response = await GetData(item);
bag.Add(response);
// some post stuff
}
var count = bag.Count;
यह समस्या 0 होने के कारण होती है, क्योंकि बनाए गए सभी थ्रेड प्रभावी रूप से सिर्फ बैकग्राउंड थ्रेड होते हैं और Parallel.ForEach
कॉल पूरा होने का इंतजार नहीं करता है। यदि मैं async कीवर्ड हटाता हूं, तो विधि इस प्रकार दिखाई देती है:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
// some pre stuff
var responseTask = await GetData(item);
responseTask.Wait();
var response = responseTask.Result;
bag.Add(response);
// some post stuff
}
var count = bag.Count;
यह काम करता है, लेकिन यह पूरी तरह से प्रतीक्षित चतुराई को निष्क्रिय कर देता है और मुझे कुछ मैनुअल अपवाद को संभालना पड़ता है .. (संक्षिप्तता के लिए हटाया गया)।
मैं एक Parallel.ForEach
लूप कैसे लागू कर सकता हूं , जो लंबोदर के भीतर प्रतीक्षित कीवर्ड का उपयोग करता है? क्या यह संभव है?
Parallel.ForEach पद्धति का प्रोटोटाइप एक Action<T>
पैरामीटर के रूप में लेता है , लेकिन मैं चाहता हूं कि यह मेरे अतुल्यकालिक लैम्बडा की प्रतीक्षा करे।
await
से हटाने का मतलब थाawait GetData(item)
क्योंकि यह एक संकलन त्रुटि के रूप में होगा।