HttpWebRequest和Parallel.ForEach在产生一定数量的线程后导致超时

时间:2012-11-08 21:21:02

标签: .net httpwebrequest timeout parallel.foreach

我遇到了一个问题,我正在寻找最好的方法来处理它。我在Parallel.ForEach循环中使用HttpWebRequest(代码如下)。我已经在二十多台机器和许多不同类型的连接上测试了该程序,直到现在它一直运行良好。

今天,我的ADSL调制解调器已经死了,并被ISP取代了 - 现在,当我运行程序时,一旦产生的线程达到35-40,我得到的就是超时;那时,即使我尝试在浏览器中加载网站,他们也会超时。

我的猜测是调制解调器无法处理并发连接 - 问题是如何防止这种情况发生?当然,我可以限制并发连接的数量,但应该有更好的方法来处理这个问题?

非常感谢任何帮助。

string pageContent;
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(webSiteUrl);
myReq.UserAgent = "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)";

myReq.Method = "GET";
myReq.Accept = "text/html";

myReq.Timeout = webRequestTimeout; //set to generous 90 seconds
myReq.ReadWriteTimeout = webRequestTimeout;  //set to 90 seconds


HttpWebResponse myres = (HttpWebResponse)myReq.GetResponse();

using (StreamReader sr = new StreamReader(myres.GetResponseStream(), Encoding.Default))
{
    pageContent = sr.ReadToEnd();

}

myres.Close();

1 个答案:

答案 0 :(得分:1)

Parallel.ForEach()可以很好地为CPU绑定操作猜测正确的并行度,但是对于IO绑定操作,它很可能会使用比理想值高得多的并行度。我认为40个线程太多了,特别是在较慢的连接上。

您应该做的是将MaxDegreeOfParallelism设置为适合您的数字,最有可能小于40。