C# &引用;XmlDocument的任何公共静态成员都是线程安全的。任何实例成员都不能保证线程安全:是的,但是

C# &引用;XmlDocument的任何公共静态成员都是线程安全的。任何实例成员都不能保证线程安全:是的,但是,c#,thread-safety,xmldocument,xmlnodelist,C#,Thread Safety,Xmldocument,Xmlnodelist,我在MSDN上看到 此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不能保证线程安全 对于XmlNodeList类也是如此 我在下面的上下文中使用这些类。在一个并行程序中。Foreach我做: X MyX = new X(); string XMLstring = MyX.GetXML(ID, true); XmlDocument doc = new XmlDocument(); doc.LoadXml(XMLstring); XmlNodeList n

我在MSDN上看到

此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不能保证线程安全

对于
XmlNodeList
类也是如此

我在下面的上下文中使用这些类。在一个
并行程序中。Foreach
我做:

X MyX = new X();
string XMLstring = MyX.GetXML(ID, true);
XmlDocument doc = new XmlDocument();
doc.LoadXml(XMLstring);
XmlNodeList nodeList = doc.SelectNodes("blah/secondblah");
其中,
X
是在库中定义的,它提供给我,
ID
是一个
int
(大致上是我循环的)

这已经在非并行上下文中进行了彻底的测试,由
GetXML
生成的
string
确实正确,相应的
XmlDocument
也正确,并且通过
XmlNodeList
对其进行“解析”提供了预期的结果

现在,假设
X
GetXML
确实是线程安全的,那么每个循环中的
new
XmlDocument
是否确保了线程安全?我的意思是,我怎么知道
XmlDocument
接收
LoadXml
string
成员(首先有这样一个字符串吗?因为我在文档中没有看到任何
string
属性)是否是
static


我想我并不真正理解我在上面引用的MSDN文档…

文档意味着任何静态方法(看起来像
XmlDocument.MethodCall
都是线程安全的。这与您无关-您不会调用任何这些方法。其他方法(例如,针对
doc
)不是静态的,因此不能保证线程安全

只要
doc
(和
nodeList
和其他“非线程安全”变量)仅在单个线程的上下文中使用,您的代码将100%正常

因此,如果您在Parallel.ForEach之前填充了
doc
,然后在Parallel.ForEach内部使用
doc
,那么这将不起作用

但是如果你在Parallel.ForEach中填充并使用
doc
,你就可以了(因为每个线程都有自己的doc-因此线程安全不会成为问题)


要100%确定,您需要发布整个方法(包括Parallel.ForEach调用)让我们来看看。

是的,它是线程安全的。线程之间不共享任何内容。我在大型多线程应用程序中使用了类似的XmlDocument代码,没有任何问题。理论上,XmlDocument中可能存在我们不知道哪些不是线程安全的私有静态数据,但我的经验是,这不是case.我认为MSDN文档意味着微软已经确保了任何可以跨线程共享的静态内容实际上都是线程安全的。

我确认
doc
(以及
nodeList
和其他“非线程安全”变量)仅在单个线程的上下文中使用。关于文档:我只看到提到的是“成员”,而不是“方法”。我对
C#
相当陌生,因此错过了一些词汇点,或者“成员”包括方法(代码)和属性(数据)。在这个问题的上下文中,成员和方法是等价的。很抱歉更改了您的术语。是的,“XmlDocument中可能存在我们不知道的非线程安全的私有静态数据”正是我的观点。正如@mjwills在您之前回答的那样,我将接受他的回答,但您的回答让我放心!谢谢。