我已经完成了基本的foreach
循环XmlNodeList
,如下所示。
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>
答案 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即可正常工作。