Ecco un metodo che esegue una ricerca DFS e restituisce un elenco di tutti gli elementi con un ID elemento di livello superiore. Come posso modificare questo per sfruttare l'elaborazione parallela? Attualmente, la chiamata per ottenere gli elementi secondari viene effettuata una per volta per ogni elemento nello stack. Sarebbe bello poter ottenere contemporaneamente gli elementi secondari per più elementi nello stack e compilare più rapidamente la mia lista di ritorno. Come posso fare questo (usando async / await o TPL, o qualsiasi altra cosa) in modo thread-safe?
private async Task<IList<Item>> GetItemsAsync(string topItemId)
{
var items = new List<Item>();
var topItem = await GetItemAsync(topItemId);
Stack<Item> stack = new Stack<Item>();
stack.Push(topItem);
while (stack.Count > 0)
{
var item = stack.Pop();
items.Add(item);
var subItems = await GetSubItemsAsync(item.SubId);
foreach (var subItem in subItems)
{
stack.Push(subItem);
}
}
return items;
}
Stavo pensando a qualcosa in questo senso, ma non sta andando insieme:
var tasks = stack.Select(async item =>
{
items.Add(item);
var subItems = await GetSubItemsAsync(item.SubId);
foreach (var subItem in subItems)
{
stack.Push(subItem);
}
}).ToList();
if (tasks.Any())
await Task.WhenAll(tasks);
La lingua che sto utilizzando è C #.