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.ForEach
chiamata 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.ForEach
ciclo 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.
await
dalawait GetData(item)
secondo blocco di codice in quanto produrrebbe un errore di compilazione così com'è.