C# Parallel.Foreach 与 XML
C# Parallel.Foreach with XML
我是 C# 的新手,虽然对其他语言有一些小的经验并且遇到了障碍。
下面的代码完全符合预期:
XmlDocument doc = new XmlDocument();
doc.Load("config.xml");
foreach (XmlNode node in doc.DocumentElement.ChildNodes)
{
string name = node.Attributes["name"].Value;
string ips = node.Attributes["ip"].Value;
string port = node.Attributes["port"].Value;
Console.WriteLine(name + " | " + ips + ":" + port);
}
我得到了我所期望的零错误,但是下面的代码让我难住了。我希望有人能解释我做错了什么,因为我觉得我可能缺少一些基本的东西。
XmlDocument doc = new XmlDocument();
doc.Load("config.xml");
node = doc.DocumentElement.ChildNodes;
Parallel.ForEach(node,
(item) => {
string name = item.Attributes["name"].Value;
string ips = item.Attributes["ip"].Value;
string port = item.Attributes["port"].Value;
Console.WriteLine(name + " | " + ips + ":" + port);
});
我只是想 运行 并行循环的每次迭代。当我尝试编译时出现以下错误:
CS0411 方法 'Parallel.ForEach 的类型参数
(IEnumerable, Action)' 无法从用法中推断出来。
尝试明确指定类型参数。
下面的示例 XML:
<item name="pc01" ip="192.168.0.10" port="80"><!--PC01--></item>
<item name="pc02" ip="192.168.0.11" port="80"><!--PC02--></item>
<item name="pc03" ip="192.168.0.12" port="80"><!--PC03--></item>
<item name="pc04" ip="192.168.0.13" port="80"><!--PC04--></item>
如有任何帮助,我们将不胜感激。
您需要 Cast
非通用类型。完整解决方案如下。
static void Main(string[] args)
{
var xml="<root><item name='pc01' ip='192.168.0.10' port='80'><!--PC01--></item><item name='pc02' ip='192.168.0.11' port='80'><!--PC02--></item><item name='pc03' ip='192.168.0.12' port='80'><!--PC03--></item><item name='pc04' ip='192.168.0.13' port='80'><!--PC04--></item></root>";
XmlDocument doc=new XmlDocument();
// doc.Load("config.xml");
doc.LoadXml(xml);
var nodeList=doc.DocumentElement.ChildNodes;
Parallel.ForEach(nodeList.Cast<XmlNode>(),
item => {
string name=item.Attributes["name"].Value;
string ips=item.Attributes["ip"].Value;
string port=item.Attributes["port"].Value;
Console.WriteLine(name + " | " + ips + ":" + port);
});
Console.ReadLine();
}
控制台中显示的项目是否乱序?
您可以从多个线程安全地调用 Console.WriteLine
,但我不会指望实际按预期顺序写入控制台的项目。我希望它们 通常 以预期的顺序写入,但有时不会。这就是多线程执行的行为。它会做你期望它做的事,但永远不会指望它按预期的顺序发生,即使你一遍又一遍地测试它确实按预期的顺序发生。
我是 C# 的新手,虽然对其他语言有一些小的经验并且遇到了障碍。
下面的代码完全符合预期:
XmlDocument doc = new XmlDocument();
doc.Load("config.xml");
foreach (XmlNode node in doc.DocumentElement.ChildNodes)
{
string name = node.Attributes["name"].Value;
string ips = node.Attributes["ip"].Value;
string port = node.Attributes["port"].Value;
Console.WriteLine(name + " | " + ips + ":" + port);
}
我得到了我所期望的零错误,但是下面的代码让我难住了。我希望有人能解释我做错了什么,因为我觉得我可能缺少一些基本的东西。
XmlDocument doc = new XmlDocument();
doc.Load("config.xml");
node = doc.DocumentElement.ChildNodes;
Parallel.ForEach(node,
(item) => {
string name = item.Attributes["name"].Value;
string ips = item.Attributes["ip"].Value;
string port = item.Attributes["port"].Value;
Console.WriteLine(name + " | " + ips + ":" + port);
});
我只是想 运行 并行循环的每次迭代。当我尝试编译时出现以下错误:
CS0411 方法 'Parallel.ForEach 的类型参数 (IEnumerable, Action)' 无法从用法中推断出来。 尝试明确指定类型参数。
下面的示例 XML:
<item name="pc01" ip="192.168.0.10" port="80"><!--PC01--></item>
<item name="pc02" ip="192.168.0.11" port="80"><!--PC02--></item>
<item name="pc03" ip="192.168.0.12" port="80"><!--PC03--></item>
<item name="pc04" ip="192.168.0.13" port="80"><!--PC04--></item>
如有任何帮助,我们将不胜感激。
您需要 Cast
非通用类型。完整解决方案如下。
static void Main(string[] args)
{
var xml="<root><item name='pc01' ip='192.168.0.10' port='80'><!--PC01--></item><item name='pc02' ip='192.168.0.11' port='80'><!--PC02--></item><item name='pc03' ip='192.168.0.12' port='80'><!--PC03--></item><item name='pc04' ip='192.168.0.13' port='80'><!--PC04--></item></root>";
XmlDocument doc=new XmlDocument();
// doc.Load("config.xml");
doc.LoadXml(xml);
var nodeList=doc.DocumentElement.ChildNodes;
Parallel.ForEach(nodeList.Cast<XmlNode>(),
item => {
string name=item.Attributes["name"].Value;
string ips=item.Attributes["ip"].Value;
string port=item.Attributes["port"].Value;
Console.WriteLine(name + " | " + ips + ":" + port);
});
Console.ReadLine();
}
控制台中显示的项目是否乱序?
您可以从多个线程安全地调用 Console.WriteLine
,但我不会指望实际按预期顺序写入控制台的项目。我希望它们 通常 以预期的顺序写入,但有时不会。这就是多线程执行的行为。它会做你期望它做的事,但永远不会指望它按预期的顺序发生,即使你一遍又一遍地测试它确实按预期的顺序发生。