Ich habe ein System, das einige XmlReader
und XmlWriter
Instanzen erstellt, und übergibt sie Clients , so dass die Clients XML schreiben und lesen können.
Manchmal greifen mehrere Threads auf das System zu:
- Thread 1 erhält eine
XmlWriter
Instanz und beginnt mit dem Schreiben
- Thread 2 ruft eine
XmlReader
-Instanz ab, die dasselbe XML-Dokument darstellt, und beginnt mit dem Lesen.
Offensichtlich beginnt der Leser manchmal zu lesen, bevor der Schreiber den Schreibvorgang abgeschlossen hat, wodurch eine Ausnahme im Leser ausgelöst wird:
System.Xml.XmlException: Root-Element fehlt.
Das ist nicht besonders überraschend, aber gibt es eine Möglichkeit, dieses System threadsicher zu machen?
- Ist es möglich, dass der Leser liest, während der Writer schreibt? Ich habe versucht, einen
MemoryStream
als zugrunde liegenden Datenspeicher zu verwenden, aber das schien nicht zu funktionieren.
- Ist es möglich, den Leser warten zu lassen, bis der Schreiber fertig geschrieben hat?
- Ist es möglich zu erkennen, dass der Schreiber noch schreibt?
Jeder der obigen Ansätze würde meines Erachtens mein Problem lösen. Es ist nicht erforderlich, dass das Schreiben und Lesen gleichzeitig erfolgt. Eigentlich wäre ich sehr glücklich, wenn ich dem Kunden einfach mitteilen könnte, dass der Reader noch nicht bereit ist, und es später erneut versuchen muss. Dies erfordert jedoch, dass es eine Möglichkeit gibt zu erkennen, dass der Schreiber noch schreibt.
Ich habe die volle Kontrolle über den Code, der die Instanzen XmlReader
und XmlReader
erstellt, aber ich kann die öffentliche API nicht ändern. Ich kann ein XmlWriter
, ein string
, ein StringBuilder
oder irgendein anderes speicherinternes Objekt, das den Job erledigt, als zugrunde liegenden Speicher verwenden, und ich kann jede abgeleitete Klasse von MemoryStream
und% co_de verwenden %.
Gibt es eine Möglichkeit, dieses System threadsicher zu machen?