RDT_ReadLock 用法

_VSRDTFLAGS.RDT_ReadLock 是一个标志,提供用于锁定正在运行的文档表 (RDT) 中的文档的逻辑,RDT 是当前在 Visual Studio IDE 中打开的所有文档列表。 根据此标志确定文档的打开时间,以及文档是显示在用户界面中,还是以不可见方式保存在内存中。

通常,当满足下列任一条件时,使用 _VSRDTFLAGS.RDT_ReadLock

  • 你想要以不可见且只读的方式打开文档,但尚未确定那个 IVsHierarchy 拥有该文档。

  • 你希望用户在 UI 中显示之前以不可见方式打开的文档并尝试关闭该文档之前,系统提示用户保存该文档。

如何管理可见和不可见文档

当用户在 UI 中打开文档时,必须确定该文档的 IVsHierarchy 所有者,并且必须设置 _VSRDTFLAGS.RDT_EditLock 标志。 如果未确定 IVsHierarchy 所有者,则当用户单击“全部保存”或关闭 IDE 时,系统将不会保存该文档。 这意味着,如果以不可见方式打开在内存中修改的文档,并且在关闭时或选择“全部保存”以保存文档时系统提示用户保存该文档,则无法使用 RDT_ReadLock。 相反,必须使用 RDT_EditLock 并在设置 __VSREGDOCLOCKHOLDER.RDLH_WeakLockHolder 标志时注册 IVsDocumentLockHolder

RDT_EditLock 和文档修改

前面提及的标志表示,当用户在可见的 DocumentWindow 中打开文档时,以不可见方式打开的文档将生成其 RDT_EditLock。 发生这种情况时,当用户关闭可见的 DocumentWindow 时会显示“保存”提示。 使用 IVsInvisibleEditorManager 服务的 Microsoft.VisualStudio.Package.Automation.OAProject.CodeModel 实现最初在只使用 RDT_ReadLock 时起作用(即以不可见方式打开文档以解析信息时)。 稍后,如果必须修改文档,则锁定将升级为弱 RDT_EditLock。 如果用户随后在可见的 DocumentWindow 中打开该文档,则会释放 CodeModel 的弱 RDT_EditLock

如果用户随后关闭 DocumentWindow,并在系统提示保存打开的文档时选择“否”,则 CodeModel 实现将释放该文档中的所有信息,并在下次需要该文档的更多信息时从磁盘以不可见方式重新打开文档。 这种行为的巧妙之处在于,当用户打开以不可见方式打开的文档的 DocumentWindow,进行修改、关闭,然后在系统提示保存文档时选择“否”。 在这种情况下,如果文档具有 RDT_ReadLock,则该文档实际上并不会关闭,并且修改后的文档将在内存中以不可见方式保持打开状态,即使用户选择不保存文档也是如此。

如果以不可见方式打开的文档使用弱 RDT_EditLock,则在用户以可见方式打开该文档时会生成锁,并且不会保留其他锁。 当用户关闭 DocumentWindow,并在系统提示保存文档时选择“否”,则必须从内存中关闭该文档。 这意味着不可见客户端必须侦听 RDT 事件才能跟踪此事件的发生。 下次需要该文档时,必须重新打开文档。