C# 在C中与XmlNodeList一起使用Parallel.ForEach
我已经用XmlNodeList完成了基本的foreach循环,如下所示 如何将此循环转换为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
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一起工作。