延迟的文档加载

当用户重新打开 Visual Studio 解决方案时,不会立即加载大多数关联的文档。 文档窗口框架以挂起初始化状态创建,占位符文档(称为存根框架)放置在“正在运行的文档”表中(RDT)。

扩展可能会导致项目文档在加载之前查询文档中的元素,从而增加 Visual Studio 的总体内存占用量,从而不必要地加载项目文档。

文档加载

当用户访问文档时,会完全初始化存根框架和文档,例如,选择窗口框架的选项卡。 还可以通过扩展来初始化文档,该扩展通过直接访问 RDT 来获取文档数据或通过进行以下调用之一间接访问 RDT 来请求文档数据:

可以通过订阅完全初始化文档时引发的 RDT 事件来了解文档是否已加载。 有两种可能性:

以下示例是一个假设的文档访问方案:Visual Studio 扩展希望显示有关打开文档的一些信息,例如编辑锁定计数和文档数据的相关信息。 它枚举 RDT IEnumRunningDocuments中的文档,然后调用 GetDocumentInfo 每个文档以检索编辑锁定计数和文档数据。 如果文档处于挂起初始化状态,则请求文档数据会导致它被不必要的初始化。

访问文档的更高效方法是用于 GetDocumentEditLockCount 获取编辑锁定计数,然后用于 GetDocumentFlags 确定文档是否已初始化。 如果标志不包含 _VSRDTFLAGS4。RDT_PendingInitialization,文档已初始化,并且请求文档 GetDocumentData 数据不会造成任何不必要的初始化。 如果标志包含 _VSRDTFLAGS4。RDT_PendingInitialization,扩展应避免在初始化文档之前请求文档数据。 可以在事件处理程序中 OnAfterAttributeChange(Ex) 检测此初始化。

测试扩展以查看它们是否强制初始化

没有可见提示来指示文档是否已初始化,因此很难确定扩展是否强制初始化。 可以设置一个注册表项,以便更轻松地进行验证,因为它会导致未完全初始化的每个文档的标题在标题中具有文本 [Stub]

HKEY_CURRENT_U标准版R\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoad 中,将 StubTabTitleFormatString 设置为 {0} [Stub]