【问题标题】:Use Parallel.ForEach with XmlNodeList in C#在 C# 中将 Parallel.ForEach 与 XmlNodeList 一起使用
【发布时间】:2016-09-09 07:25:51
【问题描述】:

我已经用XmlNodeList 完成了基本foreach 循环,如下所示。

Sample XML File (books.xml)

XmlDocument doc = new XmlDocument();
doc.Load("books.xml");
XmlNodeList xnList = doc.SelectNodes("catalog/book");
foreach (XmlNode node in xnList)
{
   Console.WriteLine(node["author"].InnerText);
} 

如何将此循环转换为Parallel.ForEach

我已经尝试使用此代码。但它不起作用。

Parallel.ForEach(xnList, (XmlNode node) =>
{
   Console.WriteLine(node["author"].InnerText);
});

上面写着错误 2

参数 1:无法从 System.Xml.XmlNodeList 转换为 System.Collections.Generic.IEnumerable<System.Xml.XmlNode>

【问题讨论】:

    标签: c# xml parallel.foreach


    【解决方案1】:

    XmlNodeList 实现非泛型IEnumerable。您需要先转换它才能使用 IEnumerable<XmlNode>,因为这是 Parallel.ForEach 的操作:

    Parallel.ForEach(xnList.Cast<XmlNode>(), (XmlNode node) =>
    {
       Console.WriteLine(node["author"].InnerText);
    });
    

    【讨论】:

    • @devopsEMK 因为Parallel.ForEach 使用IEnumerable&lt;T&gt;,而不是IEnumerable
    【解决方案2】:

    另一个提示,你可以设置你想要的并行进程数:

     Parallel.ForEach(nodes.Cast<XmlNode>(), new ParallelOptions { MaxDegreeOfParallelism = 
     Environment.ProcessorCount },
     (XmlNode node) =>
     { 
          string value = node.InnerText;
          //Some other task
     });
    

    上面的 Envorinment.ProcessorCount 是指 CPU 向 Windows 报告的逻辑核心数。我强烈建议保持在这个数字以下。我有 i9 28 核,设置为 28,几乎锁定了你的机器(只留下 1-2 个空闲)。

    另一个用途是,当您在调试时,当您有许多线程在运行时,很难跟踪在同一位置中断的多线程。将此设置为 1 将使其像常规循环一样工作。

    请注意这一点的影响。如果您正在与公共项目进行交互,请记住您将有 20 多个平行调用一次。我发现出于某种奇怪的原因尝试添加唯一的字典术语告诉我在运行多线程时有重复项。仅使用 1 个就可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多