在C#中使用Parallel.ForEach和XmlNodeList

时间:2016-09-09 07:25:51

标签: c# xml parallel.foreach

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

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>

2 个答案:

答案 0 :(得分:6)

XmlNodeList实现非通用IEnumerable。您需要首先投放它才能使用IEnumerable<XmlNode>,因为这是Parallel.ForEach的操作:

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

答案 1 :(得分:0)

另一个提示,您可以设置所需的并行进程数:

 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多次并行通话。我发现,出于某种奇怪的原因而尝试添加唯一的Dictionary术语会告诉我运行多线程时存在重复项。.仅需1即可正常工作。