1

我在 MSDN 上的XmlDocument类文档中看到

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

上课也是一样XmlNodeList

我在以下上下文中使用这些类。在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");

whereX是在 IT 提供给我的库中定义的,而 whereIDint(我大致在哪个循环上)。

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

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

我想我不太了解上面引用的 MSDN 文档...

4

2 回答 2

2

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

只要docnodeList和其他“非线程安全”变量)仅在单个线程的上下文中使用,您的代码将 100% 没问题。

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

但是如果你在 Parallel.ForEach 中填充和使用doc 会没事的(因为每个线程都会得到它自己的文档——因此线程安全不会成为问题)。

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

于 2017-06-05T11:37:19.310 回答
1

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

于 2017-06-05T11:38:02.437 回答