在 C# 中将 Parallel.ForEach 与 XmlNodeList 一起使用
Use Parallel.ForEach with XmlNodeList in C#
我已经用 XmlNodeList
完成了基本的 foreach
循环,如下所示。
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.
我已经用 XmlNodeList
完成了基本的 foreach
循环,如下所示。
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
toSystem.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.