并发XmlReader和XmlWriter

Mar*_*ann 8 c# xml multithreading

我有一个创建一些XmlReaderXmlWriter实例的系统,并将它们传递给客户端,以便客户端可以编写和读取XML.

有时,多个线程访问系统:

  1. 线程1获取一个XmlWriter实例并开始写入
  2. 线程2获取XmlReader表示相同XML文档的实例,并开始读取.

显然,有时读者会在作者完成写作之前开始阅读,这会导致读者抛出异常:

System.Xml.XmlException:缺少根元素.

这并不特别令人惊讶,但有没有办法让这个系统线程安全?

  • 在作者写作是否可以让读者阅读?我尝试使用a MemoryStream作为底层数据存储,但这似乎不起作用.
  • 是否有可能让读者等到作者完成写作?
  • 是否有可能检测到作者仍在写作?

我认为,上述任何一种方法都可以解决我的问题.并不要求写作和阅读同时发生.实际上,如果我能简单地告诉客户要求XmlReader读者尚未准备好,我将非常高兴,并且必须稍后再试.但是,这需要有一种方法来检测作者是否还在写作.

我完全控制了创建XmlReaderXmlWriter实例的代码,但我无法更改公共API.我可以使用a string,a StringBuilder,a MemoryStream或任何其他内存中的对象来完成工作,作为底层存储,我可以使用任何派生类XmlReaderXmlWriter.

有没有办法让这个系统线程安全?

Ada*_*son 7

你最好的选择可能是创建源自XmlReader和的自定义类XmlWriter.您可以向它们添加公共同步对象,并使用类似a ReadWriterLockSlim来协调读取和写入.当你说它已经"完成"时,你必须在作家类中确定你的意思(处理?写完一个节点即使它没有完全完成?等等)

然后,您可以在读取器块中创建方法,直到写入不在进行中.