List<string> urls = this.populateRequestList();
this.Logger("Starting");
var reqs = urls.Select<string, WebRequest>(HttpWebRequest.Create).ToArray();
var iars = reqs.Select(req => req.BeginGetResponse(null, null)).ToArray();
var rsps = reqs.Select((req, i) => req.EndGetResponse(iars[i])).ToArray();
this.Logger("Done");
事情,我注意到迄今:
當我運行此代碼,「啓動」在我的日誌顯示出來,但「完成」一直沒有出現。當我在調試器中查看整個過程時,它似乎跳過它,就像它甚至不在那裏一樣。也沒有例外。當reqs.Select
正在循環通過req.EndGetResponse(iars[i])
時,它就像凍結或跳過內容。當我在調試器中查看它時,在跳到結尾之前我沒有超過10-15個循環。C#異步Http請求,如何停止跳過?
問題:
如何從期間var rsps = reqs.Select((req, i) => req.EndGetResponse(iars[i])).ToArray();
「跳過」 某個時候停止?
如何從rsps
獲取html?我認爲這個問題是由「跳過」造成的。我試着循環回答每個回覆,並呼籲Repsponse.GetResponseStream()
等等,但只要它跳過,就沒有任何反應。
啊,那是關鍵,謝謝。直到我讀到你在這裏所說的回調函數之前,我一直很難遵循異步的例子。在一個側面說明中,我無法完全測試你的代碼,因爲它拋出了一個有關task.Start()無法用null做某事的異常。 – PiZzL3 2011-03-23 01:01:29
這是[完全正常](http://msdn.microsoft.com/en-us/library/ms228967.aspx)調用'End *'來(同步)等待異步操作完成。對「啓動」的調用是不必要的。 'FromAsync'返回一個已經啓動的'Task'。 – 2011-08-23 01:36:05
task.Start()將在給定示例中導致異常,因爲Task.FromAsync會爲您啓動任務。 – Restuta 2012-06-30 23:29:56