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,但我不会指望实际按预期顺序写入控制台的项目。我希望它们 通常 以预期的顺序写入,但有时不会。这就是多线程执行的行为。它会做你期望它做的事,但永远不会指望它按预期的顺序发生,即使你一遍又一遍地测试它确实按预期的顺序发生。