延迟的文档加载

当用户重新打开 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_USER\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoad中,将 StubTabTitleFormatString 设置为 {0} [Stub]