根据MSDN,XmlSchemaSet
类不保证是线程安全的。
因此,可以使用引用一个XmlReader
对象并从多个线程同时使用的单个XmlReaderSettings
对象创建多个XmlSchemaSet
个对象吗?或者这是否意味着我需要创建一个新的XmlReaderSettings
对象,并在每次需要在后台处理新文档时为其分配XmlSchemaSet
的新副本?
似乎这样会非常浪费。特别是因为XmlSchemaSet
需要为每个新文档重新编译模式。
XmlWriter
个对象的答案是否相同?
当然,我最初填充后不会修改XmlSchemaSet
对象。在第一次使用它之前,我也会调用Compile
方法。在那之后,似乎就像一切都应该是安全的,因为只会执行读取,但我不确定。
答案 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
或类似的。