0

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

我很容易确保 XML 的所有编辑都是线程安全的(例如,使用全局锁或通过在 UI 线程上执行所有编辑),但是我注意到XObject的文档状态

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

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

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

4

1 回答 1

0

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

于 2012-08-22T21:08:41.733 回答