根据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
或类似方法中。