使用并行.c#中XmlNodeList的ForEach
本文关键字:XmlNodeList ForEach 并行 | 更新日期: 2023-09-27 18:06:22
我已经完成了foreach
与XmlNodeList
的基本循环,如下所示。
示例XML文件(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>
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
});
在上述环境中。ProcessorCount指CPU上报给Windows的逻辑核数。我强烈建议保持在这个数字以下。我有9个28核,设置为28核,几乎锁定了你的机器(只留下1-2个空闲)。
它的另一个用途是,当您在调试时,当您有许多线程运行时,很难在同一位置跟踪多线程中断。将其设置为1将使其像常规循环一样工作。
要注意这方面的影响。如果你正在与公共项目交互,记住你将在一次点击中有20多个并行调用。我发现,由于一些奇怪的原因,试图添加唯一的Dictionary术语会告诉我,在运行多线程时存在重复。只需要1个就可以了。