尝试并行运行多个HTTP请求,但受Windows限制(注册表)

我正在开发一个应用程序(winforms C#.NET 4.0),我通过简单的HTTP请求从第三方访问查找功能。我用一个参数调用一个url,作为回报,我得到一个带有查找结果的小字符串。很简单。


然而,挑战是,我必须做很多这些查找(成千上万),我想限制所需的时间。因此,我想并行运行请求(例如10-20)。我使用ThreadPool来做到这一点,我的代码的简短版本如下所示:


public void startAsyncLookup(Action<LookupResult> returnLookupResult)

{

    this.returnLookupResult = returnLookupResult;


    foreach (string number in numbersToLookup)

    {

        ThreadPool.QueueUserWorkItem(lookupNumber, number);

    }

}


public void lookupNumber(Object threadContext)

{

    string numberToLookup = (string)threadContext;

    string url = @"http://some.url.com/?number=" + numberToLookup;

    WebClient webClient = new WebClient();

    Stream responseData = webClient.OpenRead(url);

    LookupResult lookupResult = parseLookupResult(responseData);


    returnLookupResult(lookupResult);

}

我从另一个地方填写numbersToLookup(a List<String>),打电话startAsyncLookup并提供回叫功能returnLookupResult以返回每个结果。这有效,但我发现我没有得到我想要的吞吐量。


最初我认为它可能是第三方的系统结构很差,但我通过尝试同时从两台不同的机器运行相同的代码来排除这种情况。两个人中的每一个都花了一个人,所以我可以排除那一个。


然后一位同事告诉我,这可能是Windows的限制。我google了一下,发现这篇帖子说默认情况下,Windows将同一个Web服务器的同时请求数量限制为HTTP 1.0为4,HTTP 1.1为2(对于HTTP 1.1,这实际上是根据规范( RFC2068))。


上面提到的同一篇文章也提供了增加这些限制的方法。通过向[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings](MaxConnectionsPerServer和MaxConnectionsPer1_0Server)添加两个注册表值,我可以自己控制它。


所以,我尝试了这个(坐到20),重新启动我的电脑,并试图再次运行我的程序。可悲的是,它似乎没有任何帮助。我在运行批量查找时也一直关注资源监视器(参见屏幕截图),我注意到我的应用程序(标题为黑屏的应用程序)仍然只使用了两个TCP连接。


所以,问题是,为什么这不起作用?我使用错误的注册表值链接的帖子是?这可能不再可能在Windows中“破解”(我在Windows 7上)?


任何想法将受到高度赞赏:)


并且万一有人应该想知道,我也尝试过对ThreadPool上的MaxThreads的不同设置(每次从10到100),这似乎根本不影响我的吞吐量,所以问题也不应该存在。


www说
浏览 701回答 3
3回答

慕后森

这是ServicePoint的问题。它提供HTTP连接的连接管理。ServicePoint对象允许的默认最大并发连接数为2.因此,如果需要增加它,可以使用ServicePointManager.DefaultConnectionLimit属性。只需检查MSDN中的链接,您就可以看到示例。并设置您需要的值。

波斯汪

为了更快地参考某人。要增加每个主机的连接限制,您可以在Main()中或在开始发出HTTP请求之前随时执行此操作。&nbsp; &nbsp;System.Net.ServicePointManager.DefaultConnectionLimit = 1000; //or some other number > 4

UYOU

从主方法中解雇并忘记此方法。Icognito用户是正确的,只允许2个线程同时播放。private static void openServicePoint(){&nbsp; &nbsp; ServicePointManager.UseNagleAlgorithm = true;&nbsp; &nbsp; ServicePointManager.Expect100Continue = true;&nbsp; &nbsp; ServicePointManager.CheckCertificateRevocationList = true;&nbsp; &nbsp; ServicePointManager.DefaultConnectionLimit = 10000;&nbsp; &nbsp; Uri MS = new Uri("http://My awesome web site");&nbsp; &nbsp; ServicePoint servicePoint = ServicePointManager.FindServicePoint(MS);}
打开App,查看更多内容
随时随地看视频慕课网APP