【问题标题】:HttpWebRequest and Parallel.ForEach causes time out after spawning certain number of threadsHttpWebRequest 和 Parallel.ForEach 在产生一定数量的线程后导致超时
【发布时间】:2012-10-29 04:18:15
【问题描述】:

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

【问题讨论】:

  • 不,限制并发连接数可能是要走的路。使用Semaphore 很简单。

标签: .net httpwebrequest timeout parallel.foreach


【解决方案1】:

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

您应该将MaxDegreeOfParallelism 设置为适合您的数字,很可能远小于40。

【讨论】:

  • 在我的 4 台计算机上,产生的线程数从我最旧的 PC 上的 60 到我最新的双核 PC 上的 130 不等,当我使用有线 Internet 时,程序运行良好。但是,任何限制其路由器并发连接的用户都可能遇到同样的问题。可能最好的解决方法是为用户自己添加选项,以将我的程序运行的连接数限制为 10、20、30 等,然后将 MaxDegreeOfParallelism 设置为相应的数字。谢谢两位的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 2022-10-05
相关资源
最近更新 更多