Async CTPを使用してHTMLクローラを書き込もうとしていますが、これを達成するための再帰的な方法はありません。Async CTPを使用してHTMLページを同時にダウンロード
これはこれまでのコードです。
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);
});
しかし、私は、私は唯一の唯一の1つのアイテムを持っているParallel.ForEach
は、最初の(そして唯一の繰り返し)を実行するため、一度に望んでいるだろうと明らかにこれは動作しません。 ForEach
を再帰的にするために私が考えることができる最も単純なアプローチですが、私はすぐにスタック領域を使い果たしてしまいます。
MaxStackSize
に達するか、システムがメモリ不足になるまで項目を追加する再帰的継続として記述するものを作成するために、このコードをどのように再構成できるか教えてください。
+1。再帰を制御する者は、宇宙を制御する! – toddmo