尝试使用Async CTP编写HTML搜寻器我已经停滞不前,不知道如何编写无递归方法来完成此任务。使用异步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);
});
但显然,这并不工作,我会因为那个Parallel.ForEach
执行第一个(也是唯一的迭代)的时候希望我只有只有1项。我可以想到的最简单的方法,使ForEach
递归,但我不能(我不认为)这样做,因为我会很快用完堆栈空间。
任何人都可以请指导我如何重构此代码,创建我将描述为递归延续,直到达到MaxStackSize
或系统内存不足时递增项目?
+1。控制递归的人控制着宇宙! – toddmo 2013-12-14 03:31:12