RDT_ReadLock使用情况

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

通常,使用 _VSRDTFLAGS。当 以下任一项为 true 时,RDT_ReadLock:

  • 你希望以不可见和只读的方式打开文档,但尚未确定它 IVsHierarchy 应该拥有它。

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

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

当用户在 UI 中打开文档时, IVsHierarchy 必须建立文档的所有者和 _VSRDTFLAGS。 必须设置RDT_EditLock标志。 如果无法 IVsHierarchy 建立所有者,则当用户单击“ 全部保存 ”或关闭 IDE 时,文档将不会保存。 这意味着,如果文档在内存中不可见地打开,并且系统会提示用户在关闭时保存文档,或者在选择“ 全部保存 ”时保存文档,则 RDT_ReadLock 无法使用文档。 相反,必须使用RDT_EditLock__VSREGDOCLOCKHOLDER并注册一个IVsDocumentLockHolder。RDLH_WeakLockHolder标志。

RDT_EditLock和文档修改

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

如果用户随后关闭 DocumentWindow ,并在系统提示保存打开的文档时选择 “否 ”,则 CodeModel 实现将释放文档中的所有信息,并在下次需要文档详细信息时从磁盘中重新打开文档。 此行为的微妙性是用户打开不可见打开文档的 DocumentWindow 的实例,对其进行修改、关闭,然后在系统提示保存文档时选择 “否 ”。 在这种情况下,如果文档有一个 RDT_ReadLock,则文档实际上不会关闭,并且修改后的文档将在内存中不可见地保持打开状态,即使用户选择不保存文档。

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