C# 网异步HttpWebRequest的最大数量

C# 网异步HttpWebRequest的最大数量,c#,http,asynchronous,httpwebrequest,C#,Http,Asynchronous,Httpwebrequest,我需要在我的申请中处理一致的请求。我使用以下代码: public class AsyncHttpHelper { public static IEnumerable<XDocument> GetPagesAsXDocuments(IEnumerable<string> uris) { IEnumerable<IAsyncResult> asyncResults = uris .Select(uri => (HttpWebReque

我需要在我的申请中处理一致的请求。我使用以下代码:

public class AsyncHttpHelper
{
public static IEnumerable<XDocument> GetPagesAsXDocuments(IEnumerable<string> uris)
{
    IEnumerable<IAsyncResult> asyncResults = uris
        .Select(uri => (HttpWebRequest)WebRequest.Create(uri))
        .Select(webRequest => webRequest.BeginGetResponse(null, webRequest));

    WaitHandle[] handles = asyncResults.Select(asyncResult => asyncResult.AsyncWaitHandle).ToArray();
    WaitHandle.WaitAll(handles);
    var result = asyncResults
        .Select(asyncResult =>
        {
            var httpWebRequest = (HttpWebRequest)asyncResult.AsyncState;
            HttpWebResponse response;
            try
            {
                response = (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult);
            }
            catch (Exception ex)
            {
                return null;
            }
            Stream responseStream = response.GetResponseStream();
            if (responseStream == null)
            {
                return null;
            }
            using (var streamReader = new StreamReader(responseStream))
            {
                return XDocument.Load(streamReader);
            }

        });
    return result;
}

}
公共类AsyncHttpHelper
{
公共静态IEnumerable GetPagesAsXDocuments(IEnumerable URI)
{
IEnumerable asyncResults=URI
.Select(uri=>(HttpWebRequest)WebRequest.Create(uri))
.Select(webRequest=>webRequest.BeginGetResponse(null,webRequest));
WaitHandle[]handles=asyncResults.Select(asyncResult=>asyncResult.AsyncWaitHandle.ToArray();
WaitHandle.WaitAll(句柄);
var result=asyncResults
.选择(异步结果=>
{
var httpWebRequest=(httpWebRequest)asyncResult.AsyncState;
HttpWebResponse;
尝试
{
response=(HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult);
}
捕获(例外情况除外)
{
返回null;
}
Stream responseStream=response.GetResponseStream();
if(responseStream==null)
{
返回null;
}
使用(var streamReader=newstreamreader(responseStream))
{
返回XDocument.Load(streamReader);
}
});
返回结果;
}
}
但它只能正确地使用1个url进行请求。当我尝试获取2个或更多URL时,我的方法挂起。当我暂停时,调试器显示我正在执行
WaitHandle.WaitAll(句柄)这行。所以我发现并不是所有的异步请求都完成了

那么问题出在哪里呢。为什么我不能异步执行多个请求


谢谢Andrew,我记不得了,但是web.config中有一个设置指定了同时发出的web请求的数量。据我记忆所及,这个数字的默认值非常低,我相信它是2,我记不得了,但是web.config中有一个设置,指定了同时发出的web请求的数量。据我记忆所及,该数字的默认值非常低,我认为是2,这可能是服务点管理器的默认连接限制太低的问题

(@mfeingold:这就是你的意思吗?我想它默认为2) 尝试设置属性:

System.Net.ServicePointManager.DefaultConnectionLimit

在创建
HttpWebRequest

之前,可能是因为服务点管理器的默认连接限制太低

(@mfeingold:这就是你的意思吗?我想它默认为2) 尝试设置属性:

System.Net.ServicePointManager.DefaultConnectionLimit

在创建
HttpWebRequest

之前,您所说的“死锁”是什么意思?请详细说明您正在观察的行为。
catch Exception。。returnnull通常是一种非常糟糕的编程风格。首先,我想让我的方法正确运行“死锁”是什么意思?请详细说明您正在观察的行为。
catch Exception。。returnnull通常是一种非常糟糕的编程风格。首先,我想让我的方法正确运行谢谢,谢谢,