当用户重新打开 Visual Studio 解决方案时,不会立即加载大多数关联的文档。 文档窗口框架以挂起初始化状态创建,占位符文档(称为存根框架)放置在正在运行的文档表 (RDT) 中。
可能会导致你的扩展在项目文档加载之前查询其中的元素,从而不必要地加载这些文档,并增加 Visual Studio 的总体内存占用。
文档加载
当用户访问文档(例如,选择窗口框架的选项卡)时,框架存根和文档会被完全初始化。 还可以通过扩展来初始化文档,该扩展通过直接访问 RDT 来获取文档数据或通过进行以下调用之一间接访问 RDT 来请求文档数据:
- 窗口框架的 Show 方法。 
- 在以下任何属性中,调用窗口框架 GetProperty 方法: 
- 如果扩展使用托管代码,则不应调用 GetDocumentInfo ,除非确定文档未处于挂起初始化状态,或者希望文档完全初始化。 原因是该方法始终返回文档数据对象,并在必要时创建它。 相反,应在 - IVsRunningDocumentTable4接口上调用某个方法。
- 如果扩展使用C++,则可以为不需要的参数传递 - null。
- 在请求其他属性之前,可以先调用以下方法之一来避免不必要的文档加载: - GetProperty 使用 __VSFPROPID6.VSFPROPID_PendingInitialization。 
- GetDocumentFlags。 此方法返回一个 _VSRDTFLAGS4 对象,如果文档尚未初始化,该对象包含一个 _VSRDTFLAGS4.RDT_PendingInitialization 的值。 
 
可以通过订阅完全初始化文档时引发的 RDT 事件来了解文档是否已加载。 有两种可能性:
- 如果事件接收器实现 IVsRunningDocTableEvents2,则可以订阅 OnAfterAttributeChangeEx, 
- 否则,可以订阅 OnAfterAttributeChange。 
以下示例是一个假设的文档访问方案: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]。