2016-06-09 13 views
-2

Ich bin brandneu in C# obwohl einige kleinere Erfahrungen mit anderen Sprachen und haben eine Mauer getroffen.C# Parallel.Force mit XML

Der folgende Code funktioniert genau wie erwartet:

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

Ich steige aus genau das, was ich mit Null-Fehler erwarte jedoch der folgende Code hat mich ratlos. Ich hoffe, dass jemand erklären kann, was ich falsch mache, da ich das Gefühl habe, etwas Grundlegendes zu vermissen.

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

Ich versuche einfach, jede Iteration der Schleife parallel auszuführen. Wenn ich zu kompilieren versuchen bekomme ich folgende Fehlermeldung:

CS0411 Die Art Argumente für die Methode ‚Parallel.ForEach (IEnumerable, Aktion)‘ kann aus der Nutzung nicht abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben.

Beispiel XML unter:

<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> 

Jede Hilfe wäre sehr dankbar.

+7

Was ist das Problem? – SLaks

+0

Nebenbei, [die Dokumentation] (https://msdn.microsoft.com/en-us/library/system.xml.xmldokument (v = vs.110) .aspx) gibt an, dass 'XmlDocument' Thread nicht garantiert ist sicher. Obwohl es nicht sehr wahrscheinlich ist, dass Abfragen ein Problem verursachen, ist dies möglicherweise riskant. Haben Sie wirklich ein Performance-Problem im Singlethread-Fall? –

+0

@Charles Mager, ich glaube XmlDocument sollte über Threads fein sein, wenn Sie nur lesen. –

Antwort

0

Sie benötigen Cast nicht generische Typen. Vollständige Lösung unten.

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(); 
    } 
+0

Das war genau das Richtige für eine Lösung. Ich konnte auch die doc.load ("config.xml") verwenden, die genau das ist, wonach ich gesucht habe. Ich werde über das Detail Casting nicht generischer Typen nachlesen müssen, da ich wirklich nicht verstehe, was das bedeutet, aber jetzt habe ich etwas zu erreichen. Prost! – Majickal

+0

Kein Problem und viel Glück! –

0

Sind die Elemente in der Konsole nicht in der richtigen Reihenfolge? Sie können sicher aus mehreren Threads aufrufen, aber ich würde nicht darauf zählen, dass die Elemente tatsächlich in der erwarteten Reihenfolge in die Konsole geschrieben werden. Ich würde erwarten, dass sie in der Regel in der erwarteten Reihenfolge geschrieben werden und dann manchmal nicht. Das ist das Verhalten der Multithread-Ausführung. Es wird tun, was Sie erwarten, aber nie zählen Sie darauf in der erwarteten Reihenfolge passiert, auch wenn Sie immer und immer wieder testen und es passiert in der erwarteten Reihenfolge.

+0

Danke für Ihre Antwort @Scott, ich bin nach paralleler Ausführung speziell für die Geschwindigkeit der Rückkehr und die Vermeidung von Ausführungswarteschlangen, da die Anwendung, die ich schreibe, sich auf Antwortzeiten und nicht auf die Antwortreihenfolge verlässt. – Majickal