嘗試使用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