0

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

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

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

对象的答案是否相同XmlWriter

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

4

2 回答 2

2

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

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

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

于 2017-08-14T14:10:26.980 回答
2

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

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

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

于 2017-08-14T16:39:57.387 回答