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



根据MSDN,XmlSchemaSet类不能保证是线程安全的。

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

似乎这会非常浪费。特别是因为XmlSchemaSet需要为每个新文档重新编译架构。

XmlWriter对象的答案是否相同?

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

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

现在它可能会起作用。但Microsoft明确表示它不能保证有效。因此,即使它今天有效,if 下次升级 .NET Framework 时也可能不起作用(例如(。

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

不是 100% 确定当前版本,但在 .NET 开始时我遇到了这个问题。编译XmlSchema很可能会修改它(向其添加编译后信息(。针对已经编译的验证很可能不会,但关键是:您不能依赖它。

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

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

相关内容

  • 没有找到相关文章

最新更新