C#Parallel.Foreach with XML

时间:2016-06-09 15:16:28

标签: c# xml parallel.foreach

我是C#的新手,虽然对其他语言有一些小的经验并且碰壁了。

以下代码完全符合预期:

with open('stockcontrol.csv',newline='') as f:
            for line in f:
                if code in line:
                    data = line.split(",")
                    target = (data[2])
    newlevel = stocklevel - quantity
    updatetarget = int(target) - int(newlevel)
    stocklevel = str(stocklevel)
    newlevel = str(newlevel)
    updatetarget = str(updatetarget)
    import sys
    import csv

    data=[]
    code = code
    newval= newlevel
    newtlevel = updatetarget
    f=open("stockcontrol.csv")
    reader=csv.DictReader(f,fieldnames=['code','level', 'target', 'distancefromtarget'])
    for line in reader:
      if line['code'] == code:
        line['level']= newval
        line['distancefromtarget']= newtlevel
      data.append('%s,%s,%s,%s'%(line['code'],line['level'],line['target'],line['distancefromtarget']))
    f.close()

    f=open("stockcontrol.csv","w")
    f.write("\n".join(data))
    f.close()

我完全得到了我所期望的零错误,但是以下代码让我感到难过。我希望有人可以解释我做错了什么,因为我觉得我可能缺少一些基本的东西。

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);
}

我只是试图并行运行循环的每次迭代。当我尝试编译时,我收到以下错误:

CS0411方法'Parallel.ForEach的类型参数 (IEnumerable,Action)'无法从使用中推断出来。 请尝试明确指定类型参数。

以下示例XML:

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);
      });

非常感谢任何协助。

2 个答案:

答案 0 :(得分:0)

您需要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();
    }

答案 1 :(得分:0)

控制台中显示的项目是否不按顺序排列? 您可以安全地从多个线程调用Console.WriteLine,但我不会指望按预期顺序实际写入控制台的项目。我希望他们通常以预期的顺序写,然后有时不会。这是多线程执行的行为。它会做你期望它做的事情,但永远不会指望它在预期的序列中发生,即使你一遍又一遍地测试它确实按照预期的顺序发生。