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

时间:2017-08-14 13:53:18

标签: c# .net multithreading xml-parsing xmlschemaset

根据MSDNXmlSchemaSet类不保证是线程安全的。

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

对当前版本不是100%肯定,但在.NET的开头我遇到了这个问题。编译XmlSchema最有可能修改它(向其添加编译后信息)。验证已编译的最可能不会,但重点是:你不能依赖于此。

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

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