4

我有一个关于在 VB.NET 中使用 XML 的线程安全问题。

我有一个应用程序XmlDocument在用户创建新项目/更改现有项目时管理对象。我已经知道我需要将调用同步到XmlDocument.CreateElement(...). 我的问题是,我可以在不同步的情况下继续构建返回的元素,然后在将该元素附加到XmlDocument?

这就是我认为我可以做的,我只需要确保它是线程安全的,就像我认为的那样:

' "doc" object already exists as an XmlDocument
SyncLock doc
  Dim newsub As XmlElement = doc.CreateElement("submission")
End SyncLock

' use "newsub" here without synchronization

SyncLock doc
  doc.Item("submissions").AppendChild(newsub)
End SyncLock

当添加“newsub”的孩子时,我也只会在创建每个元素时进行同步。

作为这个问题的后续,我是否会更好地同步“newsub”对象的整个构建?我认为像上面那样做更好的原因是为了提高性能,但我绝不是专家,我是否真的对性能产生了有意义的影响,或者只是使事情复杂化。

4

1 回答 1

4

通常,当使用从XmlNode派生的任何类时,您将需要同步,因为它的文档明确指出:

此类型的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。

这意味着您在添加子项时需要同步,如您所示。

作为这个问题的后续,我是否会更好地同步“newsub”对象的整个构建?我认为像上面那样做更好的原因是为了提高性能,但我绝不是专家,我是否真的对性能产生了有意义的影响,或者只是使事情复杂化。

这取决于 - 如果您要做的任何事情可能导致它可以从多个线程中使用,那么您可能需要同步它。

在您上面的代码中,在同步之外使用它应该是安全newsub的,因为它不是实际文档树的一部分,直到您将其作为子项附加。这将减少doc锁定的时间,如果从多个线程中使用,这可以减少争用。doc

于 2013-05-21T16:49:40.880 回答