2009-11-09 32 views
3

我想知道如果我可以安全地從多線程使用SelectNodes()和SelectSingleNode()從一個XmlDocument對象讀取沒有問題。 MSDN表示他們不能保證線程安全。如果SelectNodes()和SelectSingleNode()確實存在從多個線程運行的問題,我可以使用正確的鎖定來避免任何問題嗎?我有一個WCF服務設置,需要從數據庫中獲取一大塊xml,並從這個xml中選擇一些信息。我想緩存xml以避免經常碰到數據庫,但我擔心線程的安全性和性能。有沒有更好的方式去做這件事?謝謝正在從XmlDocument對象讀取線程安全嗎?

回答

5

這是交易。如果文檔說實例方法不能保證線程安全,那麼你最好注意一下。如果您決定在沒有適當的同步機制的情況下使用多線程場景中的類,那麼您需要了解忽略文檔的後果,以及2)爲所有假設準備在未來版本的課程中失效。即使對於似乎只讀取內部狀態的方法,此建議也是有效的。

你怎麼知道SelectNodes和SelectSingleNodes不修改內部變量?因爲如果他們這樣做,他們絕對不是線程安全的!現在,我碰巧使用了Reflector來查看裏面,我可以看到他們不修改任何內部變量。但是,你怎麼知道這在未來的版本中不會改變?

現在,由於我們實際上知道SelectNodes和SelectSingleNodes不會修改類的內部狀態,因此儘管出現警告,但只有在以下條件適用的情況下,它們纔可以用於多線程操作。

  • 在初始化XmlDocument之後,除了SelectNodes或SelectSingleNode之外,沒有其他方法被調用... ever。因爲我沒有檢查過XmlDocument類中的所有方法,所以我不能說哪些修改了類的內部狀態,哪些不修改,結果我會考慮除了我剛纔提到的兩種方法之外的所有方法,鎖定免費的方法來使用該類。
  • 在一個線程上初始化XmlDocument之後,在另一個線程上調用SelectNodes或SelectSingleNodes之前,會創建顯式或隱式內存屏障。我應該注意到,由於獲得多線程環境設置,內存屏障很可能會爲您隱式創建。但是,我可以想到一些細微的情況,這種情況下,這種情況。

我的建議...從字面上理解文檔中的警告並使用適當的同步機制。

0

SelectNodes/SelectSingleNode應該是安全的(它們只讀取數據)。當然,你需要將這些與任何實際修改xml的方法進行同步。

2

正如您要寫入/從XML文檔讀取/ /如果您不想運行競爭條件需要同步這兩個操作。如果你關心性能(誰不關心?)ReaderWriterLockSlim可能比鎖定更好。

+0

我不需要修改實際的XML,所以我不關心寫入它,只是讀它。當我創建XmlDocument並將其分配給我的靜態變量時,我需要鎖定它。雖然我不熟悉ReaderWriterLockSlim。 – Tallek 2009-11-09 20:03:54

+1

您應該關注編寫,因爲XML文檔本身不會自動填充,並且如果您在填寫時有人試圖從中讀取它,那麼他將遇到競爭狀況。 – 2009-11-09 20:06:34

0

當您調用createInstance時,您還可以使用MsXml FreeThreadedDOMDocument模型而不是古典DomDocument。

請注意,根據this article,FreeThreadedDOMDocument比傳統DomDocument慢7倍或10倍。