根据MSDN的说法,XmlSchemaSet
类不能保证线程安全.
那么,可以通过引用一个XmlReader
对象并从多个线程并发地使用单个XmlReaderSettings
对象来创建多个XmlSchemaSet
对象吗?或者,这是否意味着每当我需要在后台处理新文档时,都需要创建一个新的XmlReaderSettings
对象并为其分配一个新的XmlSchemaSet
副本?
看来这会很浪费。特别是因为XmlSchemaSet
需要为每个新文档重新编译模式。
对于XmlWriter
对象,答案是否相同?
当然,在最初填充XmlSchemaSet
对象之后,我不会修改它。在第一次使用Compile
方法之前,我还会调用它。在那之后,似乎一切都应该是安全的,因为只有读取将被执行,但我不确定。
发布于 2017-08-14 14:10:26
如果它说它不是线程安全的,那么(合同上的)您不能同时共享/使用它。
现在,,它可能工作,。但微软明确表示,它并不是保证的就能工作。因此,即使它在今天工作,如果下次升级.NET框架时可能无法工作(例如)。
使用在http://referencesource.microsoft.com/#System.Xml/System/Xml/Schema/XmlSchemaSet.cs中不安全的其他类型(例如,Hashtable
__)将意味着我强烈鼓励您不要跨线程使用XmlSchemaSet
。跨多个线程使用XmlSchemaSet
,如果您是只是读取(例如,因为Hashtable
支持多个读取器),则可能是可以的--但是跨多个线程工作的XmlSchemaSet
不能保证永久存在(即使它现在确实工作)。
发布于 2017-08-14 16:39:57
对于当前的版本,不能百分之百肯定,但是在.NET开始的时候,我遇到了这个问题。编译XmlSchema
最有可能修改它(向其添加编译后信息)。对已经编译的程序进行验证很可能不会,但重点是:您不能依赖这一点。
从那以后,我处理它的方法是(作为始终创建新模式的替代方法),将一个单例保存在一个类中并同步访问它。这意味着:永远不要直接或间接地(例如通过XmlReader
)发出对它的引用。
通常,我编写静态服务方法来将XML加载到XDocument
或类似的文件中。
https://stackoverflow.com/questions/45676163
复制相似问题