2017-06-05 65 views
1

我在XmlDocument class documentation MSDN上看到「的XmlDocument的任何公共static成員都是線程安全的任何實例成員不能保證是線程安全的。」是的,但是

任何公共靜態(在Visual共享基本)成員是線程安全的。任何實例成員不保證是線程安全的。

對於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(大致在我環路)。

這已經在非平行上下文徹底的測試,通過GetXML產生的string s爲確實是正確的,通過提供XmlNodeList預期的結果對應的XmlDocument爲好,而「解析」它。現在

,它這種並行背景和假設XGetXML確實是線程安全的,確實的事實,我new在每一個循環的XmlDocument保證線程安全與否?我的意思是,我怎麼能知道string成員(首先是有這樣一個字符串?因爲我在文檔中沒有看到任何string屬性)XmlDocument接收LoadXmlstatic還是不是?

我想我真的不明白MSDN文檔我上面引述的位......

回答

2

文檔意味着是靜態的(這看起來像XmlDocument.MethodCall任何方法是線程安全的。這ISN 「T與你有關 - 你是不是調用任何這些其他方法(如對doc)不是靜態的 - 所以他們不能保證線程安全

您的代碼將是100%的罰款。 ,只要doc(和nodeList和其他'非線程安全'變量)僅在con中使用單線程的文本。

所以,如果你之前填充doc的Parallel.ForEach然後使用doc的Parallel.ForEach - 這是行不通的。

但是,如果你填充和使用doc的Parallel.ForEach你將被罰款(因爲每個線程將獲得它自己的doc'-因此線程安全將不再是一個問題)。

爲了100%確定,您需要發佈整個方法(包括Parallel.ForEach調用)供我們查看。

+0

我確認'doc'(和'nodeList'以及其他'非線程安全'變量)僅在單個線程的上下文中使用。關於文件:我只看到「成員」提到,而不是「方法」。我對'C#'相當陌生,所以錯過了一些詞彙點或? –

+0

「成員」包括方法(代碼)和屬性(數據)。 – Polyfun

+0

在這個問題的背景下,成員和方法是等價的。爲改變你的術語而抱歉。 – mjwills

1

是的,它是線程安全的。您不在線程之間共享任何內容。我在大型多線程應用程序中使用了類似的XmlDocument代碼,沒有任何問題。從理論上講,XmlDocument中可能存在私有靜態數據,我們不知道哪些不是線程安全的,但我的經驗是,事實並非如此。我認爲MSDN文檔暗示微軟確保任何可以跨線程共享的靜態東西實際上是線程安全的。

+0

是的,「XmlDocument中可能存在我們不知道哪些不是線程安全的私有靜態數據」正是我的觀點。 –

+0

由於@mjwills在你面前回答,我會接受他的回答,但是你的回覆是我!多謝。 –

相關問題