Entwickler-Ecke
IO, XML und Registry - XML + Thread
RBS2002 - Fr 04.12.09 00:44
Titel: XML + Thread
Hi,
habe leider nichts passendes gefunden, deswegen folgende Frage:
Ich habe mal versucht mein Programm mit Threadaufteilungen ein wenig schneller zu machen (besonders parallele Einlesefunktionalitäten die sonst nacheinander ablaufen). Aber genau dort habe ich ein Problem. Verwende ich eine normale Funktion funktioniert alles, rufe ich die Funktion normal auf funktioniert alles - nur wenn ich die XML Funktion als Thread aufrufe und diesen starte kommt eine Fehlermeldung. Hier mal die einzelnen Codefragmente:
Quellcode Threadaufruf
C#-Quelltext
1: 2:
| Thread thread = new Thread(new ThreadStart(ladenkategorie)); thread.Start(); |
Bei diesem Teil kommt die Fehlermeldung (xml_load Funktion)
C#-Quelltext
1: 2: 3: 4: 5:
| public void ladenkategorie(){ try { xmlDoc.Load("kategorien.xml"); } |
Fehlermeldung:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| System.InvalidOperationException: Das Dokument verfügt bereits über einen 'XmlDeclaration'-Knoten. bei System.Xml.XmlDocument.IsValidChildType bei System.Xml.XmlDocument.AppendChildForLoad bei System.Xml.XmlLoader.LoadDocSequence bei System.Xml.XmlLoader.Load bei System.Xml.XmlDocument.Load bei System.Xml.XmlDocument.Load bei Scan2PDF.MainForm.ladenkategorie in c:\Users\BWHK\Documents\Scan2PDF\Scan2PDF\MainForm.cs:Zeile 329 bei Scan2PDF.MainForm..ctor in c:\Users\BWHK\Documents\Scan2PDF\Scan2PDF\MainForm.cs:Zeile 595 bei Scan2PDF.Program.Main in c:\Users\BWHK\Documents\Scan2PDF\Scan2PDF\Program.cs:Zeile 27 |
Kann sich das jemand erklären - wäre nicht schlecht wenn das funktionieren würde,
mfG RBS2002
Kha - Fr 04.12.09 01:06
XmlDocument ist nicht threadsafe, greifst du denn aus mehreren Threads auf diese Instanz zu?
Am besten gibst du jedem Thread eine eigene Instanz.
RBS2002 - Sa 05.12.09 20:06
ok, erst einmal danke. Es ist momentan eine Klassenvariable (also keine lokale Funktionsvariable), wahrscheinlich liegt es daran. Wie könnte ich diese Instanz für jeden Thread vergeben?
Kha - Sa 05.12.09 20:12
Hum, du erstellst sie am Anfang von ladenkategorie :zwinker: ?
Die Daten müssen dann wohl irgendwann den Thread auch wieder verlassen, dazu musst du erst einmal verraten, wie es nach Load weitergehen soll.
RBS2002 - So 06.12.09 01:58
ja, das habe ich dann auch vor ;) (Momentan ist die xmldoc Variable, wie gesagt, eine private Klassenvariable - weiss auch nicht wieso ich so etwas gemacht habe, muss wohl aus Zeitgründen entstanden sein - ohne Thread funktionierte es ja). Nach dem Load werden die vorhandenen Einträge gelesen, sollte das Load eine Exception werfen wird die Datei erstellt. Aber ich habe das mal eben schnell ausprobiert - und jetzt funktioniert es zu mindestens auch mit Thread:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| XmlDocument temp_xmlDoc = new XmlDocument(); try { temp_xmlDoc.Load("kategorien.xml"); } catch(System.IO.FileNotFoundException) { xmlcreate("kategorien.xml"); temp_xmlDoc.Load("kategorien.xml"); } XmlNodeList list = temp_xmlDoc.SelectNodes("Root/Dokutyp/Eintrag"); foreach(XmlNode s in list){ dokutyp.Items.Add(s.InnerText.ToString()); } XmlNode temp = temp_xmlDoc.SelectSingleNode("/Root/Kategorie1"); if(temp != null){ k1.Text = temp.Attributes["Title"].InnerText.ToString(); } list = temp_xmlDoc.SelectNodes("Root/Kategorie1/Eintrag"); foreach(XmlNode s in list){ liste1.Items.Add(s.InnerText.ToString()); } temp = temp_xmlDoc.SelectSingleNode("/Root/Kategorie2"); if(temp != null){ k2.Text = temp.Attributes["Title"].InnerText.ToString(); } list = temp_xmlDoc.SelectNodes("Root/Kategorie2/Eintrag"); foreach(XmlNode s in list){ liste2.Items.Add(s.InnerText.ToString()); } temp = temp_xmlDoc.SelectSingleNode("/Root/Kategorie3"); if(temp != null){ k3.Text = temp.Attributes["Title"].InnerText.ToString(); } list = temp_xmlDoc.SelectNodes("Root/Kategorie3/Eintrag"); foreach(XmlNode s in list){ liste3.Items.Add(s.InnerText.ToString()); } |
Also dafür vielen Dank ;) Das mit der eigenen Instanz würde mich freuen - habe bisher bei C# nichts mit Threads zu tun gehabt ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!