" XmlDocument的任何公共静态成员都是线程安全的。任何实例成员都不保证是线程安全的" : 对,但是

时间:2017-06-05 11:24:23

标签: c# thread-safety xmldocument xmlnodelist

我在MSDN上的XmlDocument class documentation看到了

  

此类型的任何公共静态(在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");

其中X是在IT提供给我的库中定义的,IDint的地方(大致在我循环上)。

已经在非平行上下文中对此进行了彻底测试,string生成的GetXML确实是正确的,相应的XmlDocument也是正确的,并且"解析&#34 ;它通过XmlNodeList提供了预期的结果。

现在,这个并行上下文并假设XGetXML确实是线程安全的,我在每个循环中newXmlDocument确保线程的事实 - 安全与否?我的意思是,我怎么知道string string成员(首先是因为我没有看到文档中的任何XmlDocument属性)LoadXml收到staticthis._webView.getSettings().setBuiltInZoomControls(true); this._webView.getSettings().setDisplayZoomControls(true); 还是没有?

我想我真的不明白我上面引用的MSDN文档......

2 个答案:

答案 0 :(得分:2)

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

只要doc(以及nodeList和其他'非线程安全'变量)仅在单个线程的上下文中使用,您的代码就会100%正常。

因此,如果您在之前填充了doc 并且在Parallel.ForEach中使用了doc 内部的,那么这将无效

但是如果你在Parallel.ForEach中填充并使用doc 内部你会没事的(因为每个线程都会得到它自己的doc' - 因此线程安全不会是一个问题)。

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

答案 1 :(得分:1)

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