2012-08-22 115 views
0

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

它很容易对我来说足够,以确保XML的所有编辑是线程安全的(例如,全球锁或由UI线程上执行所有的编辑),但我注意到,为XObject状态

文档

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

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

在这种情况下,是否可以直接在XObject本身上使用锁定来保证线程安全,或者是否有替代方案?

回答

0

我不会推荐锁定XObject本身。它可能有效,但它通常不是一个好的解决方案(因为任何人都可以这么做)。你可以做的是在XObject上添加一个私有注解并锁定它。通过使用只能由您访问的类型的对象(对于程序集来说这是内部的)来使注释变为私有的。既然查找注释需要知道它的类型,如果类型是“私人”,没有人可以查看它。

+0

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