Parallel.ForEach在Azure Webjobs上返回的结果较少

时间:2015-09-07 12:44:33

标签: c# azure parallel-processing azure-webjobs parallel.foreach

在我的本地计算机上运行以下代码

Console.WriteLine("Loaded: " + records.Count);

        Parallel.ForEach(records, record =>
        {
            try
            {
                var client = new HttpClient();
                var response = client.SendAsync(new HttpRequestMessage(HttpMethod.Head, Http + record.DomainName)).Result;
                if (!response.IsSuccessStatusCode || !response.RequestMessage.RequestUri.Host.EndsWith("domain.com"))
                    return;
                var finalDomain = response.RequestMessage.RequestUri.Host.Replace(Www, null);
                if (_resultsList.Add(finalDomain))
                    Console.WriteLine("Added: " + finalDomain);
            }
            catch (Exception)
            {
                // ignored
            }
        });

Console.WriteLine("Added: " + _resultsList.Count);

将以下内容写入控制台

Loaded: 3556
Added: 1550

但是当我上传它并将其作为Azure Webjob运行时,我得到的域名会更少。

Loaded: 3556
Added: 308

使用常规Parallel.ForEach()替换foreach会在两者上返回相同数量的域,但需要更长的时间。为什么Parallel.ForEach()在Azure Webjobs上没有返回相同数量的结果,就像在我自己​​的机器上一样?

1 个答案:

答案 0 :(得分:1)

有两种可能的原因,正如@usr所说的那样,如果你不忽视异常,你就会抓住。以下是两个可能的原因,最不可能的原因是

  1. 由于环境问题(配置错误,权限,防火墙等),某些SendAsync调用可能无法通过Webjob进行调用
  2. _resultsList似乎不是线程安全的。因此,从不同的Parallel线程添加多个可能会导致异常。在添加到_resultsList集合之前使用lock()方法启动信号量