C# 锁定对XObject的线程安全访问

C# 锁定对XObject的线程安全访问,c#,thread-safety,locking,linq-to-xml,C#,Thread Safety,Locking,Linq To Xml,我正在编写一个GUI应用程序,它基于读取和编辑一个相当复杂的大型(多文档)XML结构。GUI本身主要基于数据绑定,因此与XML的大部分交互将通过基于对象的模型在UI线程上完成,该模型在幕后使用LINQ to XML,但是我知道有些操作(例如搜索和加载)将需要在后台线程上执行,因此我需要确保以线程安全的方式访问此XML 对我来说,确保XML的所有编辑都是线程安全的(例如,使用全局锁或在UI线程上执行所有编辑)非常容易,但是我注意到 此类型的任何公共静态成员都是线程安全的任何实例成员都不能保证线程安

我正在编写一个GUI应用程序,它基于读取和编辑一个相当复杂的大型(多文档)XML结构。GUI本身主要基于数据绑定,因此与XML的大部分交互将通过基于对象的模型在UI线程上完成,该模型在幕后使用LINQ to XML,但是我知道有些操作(例如搜索和加载)将需要在后台线程上执行,因此我需要确保以线程安全的方式访问此XML

对我来说,确保XML的所有编辑都是线程安全的(例如,使用全局锁或在UI线程上执行所有编辑)非常容易,但是我注意到

此类型的任何公共静态成员都是线程安全的任何实例成员都不能保证线程安全。

这意味着我必须同步对应用程序中使用的任何
XObject
实例的all访问。不幸的是,由于我的对象模型的操作方式,我很难确保模型中任何对象的至多1个实例能够访问任何给定的
XObject
,这意味着我无法通过锁定私有对象来确保线程安全(通常是防止死锁的最佳实践)


在这种情况下,可以直接在
XObject
本身上使用锁来实现线程安全,还是有其他选择?

我不建议在XObject本身上使用锁。这可能有效,但通常不是一个好的解决方案(因为任何人都可以做到)。相反,您可以在XObject上添加一个私有注释并锁定它。通过使用只能由您访问的类型(因此位于程序集内部)的对象,可以将注释设置为私有。因为查找注释需要知道它的类型,如果类型是“private”,没有人可以查找它。

我也想过使用注释,但是用于访问注释的方法也不是线程安全的,因此这仍然需要使用其他外部机制来同步对注释的访问。