XmlSchemaSet 是否允许在多个 XmlReader/XmlWriter 对象之间共享?

Is XmlSchemaSet allowed to be shared among multiple XmlReader/XmlWriter objects?

根据 MSDNXmlSchemaSet class 不保证线程安全。

那么可以用一个 XmlReaderSettings 对象引用一个 XmlSchemaSet 对象来创建多个 XmlReader 对象并从多个线程同时使用吗?或者这是否意味着我每次需要在后台处理新文档时都需要创建一个新的 XmlReaderSettings 对象并为其分配一个新的 XmlSchemaSet 副本?

看来这样会很浪费。特别是因为 XmlSchemaSet 需要为每个新文档重新编译架构。

XmlWriter 个对象的答案是否相同?

当然,我不会在初始填充后修改 XmlSchemaSet 对象。在第一次使用它之前,我还会调用 Compile 方法。在那之后,似乎一切都应该是安全的,因为只会执行读取,但我不确定。

如果它说它不是线程安全的,那么(根据合同)您不能共享它/同时使用它。

现在它可能会起作用。但是 Microsoft 明确声明它 保证 工作。因此,即使它今天有效,如果下次升级 .NET Framework 时可能无法正常工作(例如)。

http://referencesource.microsoft.com/#System.Xml/System/Xml/Schema/XmlSchemaSet.cs(例如 Hashtable)处使用非线程安全的其他类型意味着我强烈建议您不要使用 XmlSchemaSet 跨线程。如果您 只是 阅读(因为 Hashtable 支持多个阅读器,例如,跨多个线程使用 XmlSchemaSet 可能 没问题) - 但 XmlSchemaSet 不能保证永久性地跨多个线程工作(即使它今天确实有效)。

不能 100% 确定当前版本,但在 .NET 的初期,我 运行 遇到了这个问题。编译 XmlSchema 很可能会修改它(向其添加 post-编译信息)。针对已编译的验证很可能不会,但关键是:你不能依赖它。

从那以后我处理它的方法是(作为一直创建新模式的替代方法)将单例保存在 class 中并同步对其的访问。这意味着:永远不要直接或间接地引用它(例如通过 XmlReader)。

通常我编写静态服务方法来将 XML 加载到 XDocument 或类似的。