C#异步Http请求,如何停止跳过?

PiZ*_*zL3 1 c# asynchronous httpwebrequest

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"); 
Run Code Online (Sandbox Code Playgroud)

到目前为止我注意到的事情:
当我运行此代码时,"开始"显示在我的日志中,但"完成"从未显示.当我在调试器中查看整个过程时,它似乎跳过它就像它甚至不存在一样.也没有例外.当reqs.Select循环时req.EndGetResponse(iars[i]),它就像冻结或跳过东西.当我在调试器中查看它时,在它跳到最后之前我没有超过10-15个循环.

问题:
如何在某段时间内"跳过"停止此操作var rsps = reqs.Select((req, i) => req.EndGetResponse(iars[i])).ToArray();

如何从中获取HTML rsps?我认为这样做的问题源于"跳过".我尝试循环遍历每个响应并调用Repsponse.GetResponseStream()等...但是一旦跳过就没有任何反应.

eul*_*rfx 7

您的代码的问题是BeginGetResponse(null,null)接受回调作为操作完成时调用的第一个参数.此回调是应该调用EndGetResponse的地方.当您调用EndGetResponse时,操作尚未完成.

查看本文,了解如何使用迭代器在C#中创建异步Web请求:http://tomasp.net/blog/csharp-async.aspx .

如果使用任务并行库或.NET 4,您也可以这样做:

var urls = new List<string>();

            var tasks = urls.Select(url =>
                {
                    var request = WebRequest.Create(url);
                    var task = Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
                    task.Start();
                    return task;
                }).ToArray();

            Task.WaitAll(tasks);

            foreach (var task in tasks)
            {
                using (var response = task.Result)
                using (var stream = response.GetResponseStream())
                using (var reader = new StreamReader(stream))
                {
                    var html = reader.ReadToEnd();
                }                                
            }
Run Code Online (Sandbox Code Playgroud)