Bir koleksiyonu paralel olarak ele almak istiyorum, ancak onu uygulamakta güçlük çekiyorum ve bu nedenle biraz yardım umuyorum.
Paralel döngünün lambda'sı içinde C # 'da zaman uyumsuz olarak işaretlenmiş bir yöntemi çağırmak istersem sorun ortaya çıkar. Örneğin:
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;
Sorun, sayımın 0 olmasıyla ortaya çıkar, çünkü oluşturulan tüm iş parçacıkları yalnızca arka planda iş parçacıklarıdır ve Parallel.ForEach
çağrı tamamlanmayı beklemez. Eşzamansız anahtar kelimeyi kaldırırsam, yöntem şöyle görünür:
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;
Çalışıyor, ancak bekleme zekasını tamamen devre dışı bırakıyor ve bazı manuel istisna işlemlerini yapmam gerekiyor .. (Kısaca kaldırıldı).
Parallel.ForEach
Lambda içinde await anahtar sözcüğünü kullanan bir döngüyü nasıl uygulayabilirim ? Mümkün mü?
Parallel.ForEach yönteminin prototipi bir Action<T>
parametre olarak alır , ancak eşzamansız lambda'mı beklemesini istiyorum.
await
denawait GetData(item)
olduğu gibi bir derleme hatası üretecektir gibi ikinci kod bloğu.