我在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提供给我的库中定义的,ID
是int
的地方(大致在我循环上)。
已经在非平行上下文中对此进行了彻底测试,string
生成的GetXML
确实是正确的,相应的XmlDocument
也是正确的,并且"解析&#34 ;它通过XmlNodeList
提供了预期的结果。
现在,这个并行上下文并假设X
和GetXML
确实是线程安全的,我在每个循环中new
和XmlDocument
确保线程的事实 - 安全与否?我的意思是,我怎么知道string
string
成员(首先是因为我没有看到文档中的任何XmlDocument
属性)LoadXml
收到static
是this._webView.getSettings().setBuiltInZoomControls(true);
this._webView.getSettings().setDisplayZoomControls(true);
还是没有?
我想我真的不明白我上面引用的MSDN文档......
答案 0 :(得分:2)
文档意味着任何静态的方法(看起来像XmlDocument.MethodCall
都是线程安全的。这与你无关 - 你不会调用任何这些方法。其他方法(例如,对doc
)不是静态的 - 因此不保证它们是线程安全的。
只要doc
(以及nodeList
和其他'非线程安全'变量)仅在单个线程的上下文中使用,您的代码就会100%正常。
因此,如果您在之前填充了doc
并且在Parallel.ForEach中使用了doc
内部的,那么这将无效
但是如果你在Parallel.ForEach中填充并使用doc
内部你会没事的(因为每个线程都会得到它自己的doc' - 因此线程安全不会是一个问题)。
要100%确定,您需要发布整个方法(包括Parallel.ForEach调用)供我们查看。
答案 1 :(得分:1)
是的,它是线程安全的。你没有在线程之间共享任何东西。我在大型多线程应用程序中使用了类似的XmlDocument代码而没有任何问题。从理论上讲,XmlDocument中可能存在私有静态数据,我们不知道哪些不是线程安全的,但我的经验是,情况并非如此。我认为MSDN文档暗示微软已经确保可以在线程之间共享的任何静态内容实际上是线程安全的。