【问题标题】:WebRequest timeouts when processing in parallel并行处理时 WebRequest 超时
【发布时间】:2016-05-26 11:25:06
【问题描述】:

我只是想了解如何在 c# 中进行并行处理。这是我的代码示例:

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("no-reply@domain.co.uk");
            msg.To.Add("name.name@domain.com");
            msg.Body = data.ToString();
            msg.IsBodyHtml = true;
            var newSmtp = new SmtpClient();
            newSmtp.Send(msg);

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

代码的技术在这里并不重要,因为它运行良好。但是,对“一些示例性 URL”的请求相当耗时,并且在处理 +-30 个请求后,我收到“操作已超时”异常。当我更改 Parallel for 循环并像这样添加 MaxDegreeOfParallelism 选项时

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

我不再抛出异常。所以,我想弄清楚为什么添加这个选项会修复工作流程?在我看来,这与线程管理有关吗?我的理解是,当我不指定线程数时,会在等待前一个线程完成之前创建新线程?我是对的,还是我的代码有问题?

【问题讨论】:

    标签: c# multithreading parallel-processing task-parallel-library


    【解决方案1】:

    同时传出 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>
    

    【讨论】:

    • 感谢您的输入,但是,我仍然无法理解为什么设置 MaxDegreeOfParallelism 选项会修复它?是不是意味着当我将它的值设置为 4 时,这个值在 DefaultConnectionLimit 之内,因此它不会抛出任何异常?
    • 当您将 MaxDegreeOfParallelism 设置为 4 时,您会限制同时并行的数量 HttpWebRequest。无论如何,您尝试访问的服务器可以限制主机的并发连接数,这就是 connectionManagement 存在的原因。
    • 我检查了我的 DefaultConnectionLimit,它设置为 2。那么它如何处理 MaxDegreeOfParallelism 选项中设置的 4 个同时并行 Web 请求?
    • 这是一个漏斗效应问题,当你增加线程数而不增加几秒钟后可能溢出的连接数时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    相关资源
    最近更新 更多