【发布时间】:2014-04-24 18:10:00
【问题描述】:
我有一个系统创建一些XmlReader 和XmlWriter 实例,并将它们传递给客户端,以便客户端可以写入和读取 XML。
有时,多个线程访问系统:
- 线程 1 获得一个
XmlWriter实例并开始写入 - 线程 2 获得一个代表相同 XML 文档的
XmlReader实例,并开始读取。
显然,有时读者在写者完成写入之前就开始阅读,这会导致读者抛出异常:
System.Xml.XmlException : 缺少根元素。
这并不特别令人惊讶,但是有什么方法可以让这个系统线程安全?
- 是否可以让读者阅读而作者写作?我尝试使用
MemoryStream作为底层数据存储,但这似乎不起作用。 - 是否可以让读者等到作者完成写作?
- 是否可以检测到作者仍在写作?
我相信,以上任何一种方法都可以解决我的问题。写入和读取不需要同时发生。实际上,如果我可以简单地告诉请求XmlReader 的客户读者还没有准备好,我会非常高兴,它必须稍后再试。但是,这需要有一种方法来检测作者仍在写作。
我可以完全控制创建 XmlReader 和 XmlWriter 实例的代码,但我无法更改公共 API。我可以使用string、StringBuilder、MemoryStream 或任何其他可以完成工作的内存中对象作为底层存储,我可以使用XmlReader 和@987654333 的任何派生类@。
有没有办法让这个系统线程安全?
【问题讨论】:
-
您需要创建一个结帐/签入机制。
-
您可能会创建自己的流作为 XML 读取器/写入器的提供程序,并且它会阻止读取操作,直到它知道所有写入都已完成。一旦发生写入,取消阻止读取并愉快地继续。您可能仍然可以使用 MemoryStream 作为自定义流的支持。
-
当您说“客户”时,您指的是多个进程吗? (请告诉我不)。
-
@PeterRitchie 不,只是同一进程中的其他对象(但在不同的线程上)。
-
@LB2:流级别的阻塞可能不够,因为流不知道操作何时真正完成。
标签: c# xml multithreading