【问题标题】:Locking on / thread safe access to XObject锁定/线程安全访问 XObject
【发布时间】:2012-08-22 10:15:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# thread-safety locking linq-to-xml


    【解决方案1】:

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

    【讨论】:

    • 我也想过使用注解,但是用于访问注解的方法也不是线程安全的,因此这仍然需要使用其他一些外部机制来同步对注解的访问。跨度>
    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多