"Any public static members of XmlDocument are thread safe. Any instance members are not guaranteed to be thread safe" :是的,但是

"Any public static members of XmlDocument are thread safe. Any instance members are not guaranteed to be thread safe" : yes, but

我在 MSDN 的 XmlDocument class documentation 中看到

Any public static ( Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

XmlNodeList class 也一样。

我在以下上下文中使用了那些 classes。在 Parallel.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 是在 IT 提供给我的库中定义的,其中 ID 是一个 int(我大致在其上循环)。

这已经在非并行上下文中进行了全面测试,GetXML产生的string确实是正确的,对应的XmlDocument也是如此,"parsing"它通过 XmlNodeList 提供了预期的结果。

现在,它是这个并行上下文并假设 XGetXML 确实是线程安全的,那么我在每个循环中 new 一个 XmlDocument是否确保线程安全?我的意思是,我怎么知道 string 成员(首先有这样一个字符串?因为我在文档中没有看到任何 string 属性) XmlDocument 收到 LoadXmlstatic 还是不是?

我想我不太理解我在上面引用的 MSDN 文档中的一些内容...

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

只要 doc(以及 nodeList 和其他 'non thread-safe' 变量)仅在单个线程的上下文中使用,您的代码就 100% 没问题。

因此,如果您在 Parallel.ForEach 之前填充 doc ,然后在 中使用 doc Parallel.ForEach - 那是行不通的。

但是,如果您在 中填充并使用了 doc Parallel.ForEach,您会没事的(因为每个线程都会获得其 'own doc'-因此线程安全不会成为问题。

为了 100% 确定,您需要 post 整个方法(包括 Parallel.ForEach 调用)以便我们查看。

是的,它是线程安全的。您没有在线程之间共享任何内容。我在大型多线程应用程序中使用过类似的 XmlDocument 代码,没有出现问题。理论上 XmlDocument 中可能存在我们不知道哪些不是线程安全的私有静态数据,但我的经验是情况并非如此。我认为 MSDN 文档暗示微软已经确保任何可能跨线程共享的静态内容实际上是线程安全的。