c# - 并发 XmlReader 和 XmlWriter

标签 c# xml multithreading

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

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

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

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

System.Xml.XmlException : Root element is missing.

这并不奇怪,但是有什么方法可以使这个系统线程安全吗?

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

我相信上述任何一种方法都能解决我的问题。不需要同时进行写入和读取。实际上,如果我可以简单地告诉请求 XmlReader 的客户端阅读器尚未准备好,它必须稍后再试,我会非常高兴。但是,这需要有一种方法来检测作者仍在写作。

我可以完全控制创建 XmlReaderXmlWriter 实例的代码,但我无法更改公共(public) API。我可以使用 stringStringBuilderMemoryStream 或任何其他可以完成工作的内存中对象作为底层存储,我可以使用 XmlReaderXmlWriter 的任何派生类。

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

最佳答案

您最好的选择可能是创建从 XmlReaderXmlWriter 派生的自定义类。您可以向它们添加一个通用的同步对象,并使用类似 ReadWriterLockSlim 的东西来协调读取和写入。当你说它“完成”时,你必须在编写器类中确定你的意思(处理?完成编写单个节点,即使它没有完全完成?等)

然后您可以让读取器中的方法阻塞,直到不进行写入。

关于c# - 并发 XmlReader 和 XmlWriter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23276603/

相关文章:

c# - 我应该在 MVVM 的模型中使用 ObservableCollections 吗?

c# - IIS8 没有端点监听 net.tcp :

c# - 更改 DataGridView 的可编辑列的行为

java - 单击按钮无法播放下一首歌曲

java - 在android java中从XML填充ListView

java - run() 方法后线程继续运行

c - 两个线程中的同步问题共享一个队列以使用临界区进行读写

java - ColdFusion 9 - 我的线程占用内存 - 我怎样才能停止它?

c# - 为什么我的 ASP.Net MVC 4 WEB API 操作过滤器在运行时被忽略?

android - 适配器类中的 RecyclerView 多个布局 View