在 C# 中将 Parallel.ForEach 与 XmlNodeList 一起使用

Use Parallel.ForEach with XmlNodeList in C#

我已经用 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

我试过这个code.But没用。

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

它说错误 2

Argument 1: cannot convert from System.Xml.XmlNodeList to System.Collections.Generic.IEnumerable<System.Xml.XmlNode>

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

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

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

 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 将使其像常规循环一样工作。

注意这方面的影响。如果您正在与 public 个项目进行交互,请记住您将在一次点击中进行 20 多个并行调用。我发现出于某些奇怪的原因尝试添加唯一的词典术语告诉我当 运行 多线程时存在重复项.. 仅适用于 1.