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

C# 是否允许在多个XmlReader/XmlWriter对象之间共享XmlSchemaSet?,c#,.net,multithreading,xml-parsing,xmlschemaset,C#,.net,Multithreading,Xml Parsing,Xmlschemaset,根据,XmlSchemaSet类不能保证线程安全 那么,可以使用引用一个XmlSchemaSet对象的单个XmlReaderSettings对象创建多个XmlReader对象,并从多个线程并发使用吗?或者这是否意味着每次需要在后台处理新文档时,我都需要创建一个新的XmlReaderSettings对象并为其分配一个新的XmlSchemaSet 看来这是非常浪费的。尤其是因为XmlSchemaSet需要为每个新文档重新编译模式 XmlWriter对象的答案是否相同 当然,在最初填充XmlSchem

根据,
XmlSchemaSet
类不能保证线程安全

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

看来这是非常浪费的。尤其是因为
XmlSchemaSet
需要为每个新文档重新编译模式

XmlWriter
对象的答案是否相同


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

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

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


使用其他类型的非线程安全(例如,
Hashtable
)意味着我强烈建议您不要跨线程使用
XmlSchemaSet
。如果您正在阅读
XmlSchemaSet
,那么跨多个线程使用
XmlSchemaSet
可能是可以的(例如,因为
Hashtable
支持多个读卡器)-但是
XmlSchemaSet
跨多个线程工作不能保证永久性(即使它现在确实工作).

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

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


使用其他类型的非线程安全(例如,
Hashtable
)意味着我强烈建议您不要跨线程使用
XmlSchemaSet
。如果您正在阅读
XmlSchemaSet
,那么跨多个线程使用
XmlSchemaSet
可能是可以的(例如,因为
Hashtable
支持多个读卡器)-但是
XmlSchemaSet
跨多个线程工作不能保证永久性(即使它现在确实工作).

对当前版本没有100%的把握,但在.NET的初期,我遇到了这个问题。编译
XmlSchema
很可能会修改它(向其添加编译后信息)。对已经编译的文件进行验证很可能不会,但关键是:您不能依赖于此

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


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

对当前版本不是100%确定,但在.NET的初期,我遇到了这个问题。编译
XmlSchema
很可能会修改它(向其添加编译后信息)。对已经编译的文件进行验证很可能不会,但关键是:您不能依赖于此

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


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

@mjwills抱歉,我当时不在计算机旁。是的,这两个答案都证实了我所担心的:不要依赖于此,即使可能是多读者、零作者的场景也可以工作。现在决定哪一个被接受…@mjwills对不起,我不在电脑旁。是的,这两个答案都证实了我所担心的:不要依赖于此,即使可能是多读者、零作者的场景也可以工作。现在决定将哪一个标记为已接受…我知道编译会改变状态,这就是为什么我声明在将模式集传递给任何其他线程之前进行编译。不过,我不明白你的建议如何避免这个问题。singleton或static类仍然必须创建XmlSchemaSet的副本并为每次调用重新编译它,或者在线程之间同步访问。因此,要么添加额外的计算,要么丢失并发性,这就是使用多线程的全部意义。我的意思是:同步访问和丢失并发性是为了XML解析,但当然不是为了后续处理具体化的文档,例如
XDocument
。我知道编译会改变状态,这就是为什么我声明在将模式集传递给任何其他线程之前进行编译。不过,我不明白你的建议如何避免这个问题。singleton或static类仍然必须创建XmlSchemaSet的副本并为每次调用重新编译它,或者在线程之间同步访问。因此,要么添加额外的计算,要么丢失并发性,这就是使用多线程的全部意义。我的意思是:同步访问和丢失并发性是为了XML解析,当然不是为了后续处理具体化的文档,例如
XDocument