Tenter d'écrire un moteur de balayage HTML à l'aide du CTP Async J'ai été bloqué quant à la façon d'écrire une méthode sans récursion pour accomplir ceci.Télécharger des pages HTML simultanément à l'aide du CTP Async
C'est le code que j'ai jusqu'à présent.
private readonly ConcurrentStack<LinkItem> _LinkStack;
private readonly Int32 _MaxStackSize;
private readonly WebClient client = new WebClient();
Func<string, string, Task<List<LinkItem>>> DownloadFromLink = async (BaseURL, uri) =>
{
string html = await client.DownloadStringTaskAsync(uri);
return LinkFinder.Find(html, BaseURL);
};
Action<LinkItem> DownloadAndPush = async (o) =>
{
List<LinkItem> result = await DownloadFromLink(o.BaseURL, o.Href);
if (this._LinkStack.Count() + result.Count <= this._MaxStackSize)
{
this._LinkStack.PushRange(result.ToArray());
o.Processed = true;
}
};
Parallel.ForEach(this._LinkStack, (o) =>
{
DownloadAndPush(o);
});
Mais, évidemment, cela ne fonctionne pas comme je l'espère, car au moment où Parallel.ForEach
exécute la première (et seule itération) Je ne seulement 1 point. L'approche la plus simple que je puisse imaginer pour rendre le ForEach
récursif mais je ne peux pas (je ne pense pas) le faire car je serais rapidement à court d'espace de pile.
Quelqu'un peut-il me guider sur la façon dont je peux restructurer ce code, pour créer ce que je décrirais comme une continuation récursive qui ajoute des éléments jusqu'à ce que le MaxStackSize
soit atteint ou le système manque de mémoire?
+1. Celui qui contrôle la récursivité, contrôle l'univers! – toddmo