c# - 。网。异步 HttpWebRequest 的最大数量

标签 c# http asynchronous httpwebrequest

我需要在我的应用程序中处理并发请求。我使用这段代码:

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;
}

}

但它仅适用于请求的 1 个 url。当我尝试获取 2 个或更多 url 时,我的方法挂断了。当我暂停时,调试器显示我正在执行 WaitHandle.WaitAll(handles); 这一行。所以我看到并非所有异步请求都已完成。

那么问题是什么。为什么我不能异步执行多个请求

谢谢安德鲁

最佳答案

这可能是服务点管理器的默认连接限制太低的问题。

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

System.Net.ServicePointManager.DefaultConnectionLimit

在创建 HttpWebRequest 之前达到更高的水平。

关于c# - 。网。异步 HttpWebRequest 的最大数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8456851/

相关文章:

c# - RegisterHotkey 仅适用于 WIndows 7,不适用于 XP、server 2003

http - mediafilesegmenter 只创建 aac 文件

c# - 如何模拟 .config 文件的 appSettings 部分的文件属性

c# - 如果 String.Split(String[]) 不存在,你将如何拆分\r\n ?

java - 网络连接如何在线程切换后存活下来?

asp.net - 通过 HTTP(无 HTTPS)的客户端证书身份验证

c# - 无法在 C# 中异步运行方法

javascript - Ionic Accordion 中断的切换功能。不展开第二个 Accordion 。(传递的数据太多?)

c# - 为什么 C# 中的异步调用需要这样声明,如果它们所在的方法已经用 'async' 关键字声明了?

c# - 如何将用户控件添加到面板