我正在开发一个应用程序(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),这似乎根本不影响我的吞吐量,所以问题也不应该存在。
慕后森
波斯汪
UYOU
相关分类