尝试并行运行多个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中的限制。我一派一个位,发现除其他此篇说通过默认的Windows限制同时请求同一web服务器4的数量为HTTP

1.0和2为HTTP 1.1(对于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的所有设置),并且这似乎丝毫不影响我的吞吐量,因此问题也不应该在那里。

回答:

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

以上是 尝试并行运行多个HTTP请求,但受到Windows(注册表)的限制 的全部内容, 来源链接: utcz.com/qa/403303.html

回到顶部