1

我遇到了一个问题,我正在寻找处理它的最佳方法。我在 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();
4

1 回答 1

1

Parallel.ForEach()可以很好地猜测 CPU-bound 操作的正确并行度,但是对于 IO-bound 操作,它很可能会使用远高于理想的并行度。我认为 40 个线程太多了,尤其是在连接速度较慢的情况下。

你应该做的是设置MaxDegreeOfParallelism一个适合你的数字,很可能远小于 40。

于 2012-11-09T10:16:05.373 回答