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

C# 在C中与XmlNodeList一起使用Parallel.ForEach,c#,xml,parallel.foreach,C#,Xml,Parallel.foreach,我已经用XmlNodeList完成了基本的foreach循环,如下所示 如何将此循环转换为Parallel.ForEach 我尝试过这个代码,但它不起作用 Parallel.ForEach(xnList, (XmlNode node) => { Console.WriteLine(node["author"].InnerText); }); 这是错误2 参数1:无法从System.Xml.XmlNodeList转换为 System.Collections.Generic.IEnum

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

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

我尝试过这个代码,但它不起作用

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

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

XmlNodeList实现非泛型IEnumerable。为了使用IEnumerable,您需要首先对其进行强制转换,因为Parallel.ForEach就是在这个基础上操作的:

Parallel.ForEach(xnList.Cast<XmlNode>(), (XmlNode node) =>
{
   Console.WriteLine(node["author"].InnerText);
});
XmlNodeList实现非泛型IEnumerable。为了使用IEnumerable,您需要首先对其进行强制转换,因为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将使其像常规循环一样工作


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

另一个提示,您可以设置需要多少并行进程:

 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个就可以了

@devopsEMK因为Parallel.ForEach与IEnumerable而不是IEnumerable一起工作。@devopsEMK因为Parallel.ForEach与IEnumerable而不是IEnumerable一起工作。