2012-08-22 56 views
0

我正在編寫一個基於讀取&編輯大型,相當複雜(多文檔)XML結構的GUI應用程序。 GUI本身主要基於數據綁定,因此大部分與XML的交互都將通過一個基於對象的模型在UI線程上完成,該模型涵蓋了使用LINQ to XML,但是我知道一些操作(例如搜索和加載)將需要在後臺線程上執行,因此我需要確保我們以線程安全的方式訪問此XML。鎖定/線程安全訪問XObject

它很容易對我來說足夠,以確保XML的所有編輯是線程安全的(例如,全球鎖或由UI線程上執行所有的編輯),但我注意到,爲XObject狀態

文檔

此類型的任何公共靜態成員都是線程安全的。 任何實例成員不保證是線程安全的。

這意味着我必須同步所有訪問在我的應用程序中使用的任何XObject實例。不幸的是,由於我的對象模型運行的方式,我很難確保我的模型中的任何對象的最多1個實例可以訪問任何給定的XObject,這意味着我無法通過鎖定私有對象來確保線程安全(通常是防止死鎖的最佳實踐)。

在這種情況下,是否可以直接在XObject本身上使用鎖定來保證線程安全,或者是否有替代方案?

回答

0

我不會推薦鎖定XObject本身。它可能有效,但它通常不是一個好的解決方案(因爲任何人都可以這麼做)。你可以做的是在XObject上添加一個私有註解並鎖定它。通過使用只能由您訪問的類型的對象(對於程序集來說這是內部的)來使註釋變爲私有的。既然查找註釋需要知道它的類型,如果類型是「私人」,沒有人可以查看它。

+0

我也想過使用註釋,但是用於訪問註釋的方法也不是線程安全的,所以這仍然需要使用一些其他外部機制來同步對註釋的訪問。 – Justin