Vorrei gestire una raccolta in parallelo, ma ho difficoltà a implementarla e spero quindi in un aiuto.
Il problema sorge se voglio chiamare un metodo contrassegnato come asincrono in C #, all'interno della lambda del ciclo parallelo. Per esempio:
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;
Il problema si verifica con il conteggio pari a 0, poiché tutti i thread creati sono effettivamente solo thread in background e la Parallel.ForEachchiamata non attende il completamento. Se rimuovo la parola chiave asincrona, il metodo è simile al seguente:
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;
Funziona, ma disabilita completamente la capacità di attesa e devo fare alcune gestioni manuali delle eccezioni .. (Rimosso per brevità).
Come posso implementare un Parallel.ForEachciclo che utilizza la parola chiave wait in lambda? È possibile?
Il prototipo del metodo Parallel.ForEach accetta un Action<T>parametro as, ma voglio che aspetti la mia lambda asincrona.
awaitdalawait GetData(item)secondo blocco di codice in quanto produrrebbe un errore di compilazione così com'è.