1

問題が発生し、それを処理する最善の方法を探しています。Parallel.ForEach ループで HttpWebRequest を使用しています (コードは以下にあります)。20 台以上のマシンとさまざまな種類の接続でプログラムをテストしましたが、今まで問題なく動作していました。

今日、私の ADSL モデムが故障し、ISP によって新しいモデムに交換されました。プログラムを実行すると、生成されたスレッドが 35 ~ 40 になるとすぐにタイムアウトになります。その時点で、ブラウザーに Web サイトを読み込もうとしても、タイムアウトになります。

私の推測では、モデムが同時接続を処理できないということです。問題は、これが起こらないようにするにはどうすればよいかということです。もちろん、同時接続数を制限することはできますが、これを処理するためのより良い方法があるはずですか?

どんな助けでも大歓迎です。

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 バウンド操作の適切な並列度を推測するのは得意ですが、IO バウンド操作では、理想よりもはるかに高い並列度を使用する可能性が高くなります。特に低速の接続では、40 スレッドは多すぎると思います。

あなたがしなければならないことはMaxDegreeOfParallelism、あなたにとってうまく機能する数に設定することです.40よりもはるかに小さいでしょう.

于 2012-11-09T10:16:05.373 に答える