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

问题描述 投票:0回答:1

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

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上没有返回相同数量的结果,就像在我自己​​的机器上一样?

c# azure parallel-processing azure-webjobs parallel.foreach
1个回答
1
投票

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

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