使用并行.c#中XmlNodeList的ForEach



我已经完成了foreachXmlNodeList的基本循环,如下所示。

示例XML文件(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>

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
 });

在上述环境中。ProcessorCount指CPU上报给Windows的逻辑核数。我强烈建议保持在这个数字以下。我有9个28核,设置为28核,几乎锁定了你的机器(只留下1-2个空闲)。

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

要注意这方面的影响。如果你正在与公共项目交互,记住你将在一次点击中有20多个并行调用。我发现,由于一些奇怪的原因,试图添加唯一的Dictionary术语会告诉我,在运行多线程时存在重复。只需要1个就可以了。

最新更新