আমি সমান্তরালভাবে একটি সংগ্রহ পরিচালনা করতে চাই, তবে এটিটি বাস্তবায়নে আমার সমস্যা হচ্ছে এবং তাই আমি কিছু সাহায্যের আশা করছি।
আমি যদি সমান্তরাল লুপের ল্যাম্বদার মধ্যে সি # তে অ্যাসিঙ্ক চিহ্নিত পদ্ধতিতে কল করতে চাই তবে সমস্যা দেখা দেয়। উদাহরণ স্বরূপ:
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
কল সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে না। যদি আমি অ্যাসিঙ্ক কীওয়ার্ডটি সরিয়ে ফেলি, তবে পদ্ধতিটি এমন দেখাচ্ছে:
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
লুপ বাস্তবায়ন করতে পারি , যা ল্যাম্বডায় অপেক্ষার কীওয়ার্ডটি ব্যবহার করে? এটা কি সম্ভব?
প্যারালাল.ফোরএচ পদ্ধতির প্রোটোটাইপটি Action<T>
প্যারামিটার হিসাবে গ্রহণ করে তবে আমি এটি চাই আমার অ্যাসিনক্রোনাস ল্যাম্বদার জন্য অপেক্ষা করা।
await
থেকে সরিয়ে ফেলতে চেয়েছিলেনawait GetData(item)
কারণ এটি যেমন একটি সংকলন ত্রুটি তৈরি করবে।