1

私は、並列処理がどのようにC#で動作するのかを理解しようとしています。これは私のコードの例である:それは正常に動作しますので、並列処理時のWebRequestタイムアウト

Parallel.For(0, 1000, index => 
{ 
    try 
    { 
     var url = "some exemplary url"; 
     HttpStatusCode statusCode; 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
     StringBuilder data = new StringBuilder(); 

     using (HttpWebResponse myWebResponse = (HttpWebResponse)request.GetResponse()) 
     { 
      statusCode = myWebResponse.StatusCode; 
      if (myWebResponse.GetResponseStream() != null) 
      { 
       StreamReader streamReader = new StreamReader(myWebResponse.GetResponseStream()); 

       using (streamReader) 
       { 
        string line = string.Empty; 
        while ((line = streamReader.ReadLine()) != null) 
        { 
         data.Append(line); 
        } 
       } 
      } 
      MailMessage msg = new MailMessage(); 

      msg.Subject = "subject"; 
      msg.From = new MailAddress("[email protected]"); 
      msg.To.Add("[email protected]"); 
      msg.Body = data.ToString(); 
      msg.IsBodyHtml = true; 
      var newSmtp = new SmtpClient(); 
      newSmtp.Send(msg); 

      Interlocked.Increment(ref count); 
     } 
    } 
    catch (Exception e) 
    { 
    } 
}); 

は、コードの専門的には、ここではその重要ではありません。しかし、 "模範的なURL"へのリクエストにはかなりの時間がかかり、+ 30リクエストを処理した後、 "Operation has timed out"例外がスローされてしまいます。 Parallel forループを変更してMaxDegreeOfParallelismオプションを追加すると、

Parallel.For(0, 1000, new ParallelOptions { MaxDegreeOfParallelism = 4 }, index => 
{ 

私はもう例外がスローされなくなりました。ですから、このオプションを追加するとワークフローが修正されたのはなぜですか?それはスレッド管理と関係があると私に見えますか?スレッドの数を指定しないと、前のスレッドが終了するのを待つ前に新しいスレッドが作成されるということを理解していますか?私は正しいのですか、それとも私のコードで何か間違っていますか?

答えて

2

送信HTTP同時接続数には制限があります。 スレッド数を増やす場合は、HttpWebRequestを作成する前にDefaultConnectionLimitを増やす必要があります。

System.Net.ServicePointManager.DefaultConnectionLimit 

あなたは<connectionManagement>構成タグを使用して、入力用https://msdn.microsoft.com/en-us/library/fb6y0fyc.aspx

<configuration> 
    <system.net> 
    <connectionManagement>  
     <add address = "*" maxconnection = "2" /> 
    </connectionManagement> 
    </system.net> 
</configuration> 
+0

感謝を再生することができます設定MaxDegreeOfParallelismオプションは、それを修正する理由は、しかし、私はまだ取得することはできませんか?私はその値を4に設定すると、この値がDefaultConnectionLimitの範囲内にあることを意味します。したがって、例外をスローしませんか? – Bartosz

+0

正確にMaxDegreeOfParallelismを4に設定すると、同時に並列な 'HttpWebRequest'の数を制限します。とにかく、アクセスしようとするサーバは、connectionManagementが存在する理由であるホストの同時接続数を制限することができます。 –

+0

私はDefaultConnectionLimitをチェックして2に設定されています。それで、MaxDegreeOfParallelismオプションで設定された4つの同時並列ウェブリクエストにどのように対処しますか? – Bartosz