Carga diferida de documentos
Cuando un usuario vuelve a abrir una solución de Visual Studio, la mayoría de los documentos asociados no se cargan inmediatamente. El marco de la ventana del documento se crea en un estado de inicialización pendiente y se coloca un documento de marcador de posición (denominado marco de código auxiliar) en la tabla Documento en ejecución (RDT).
La extensión puede hacer que los documentos del proyecto se carguen innecesariamente consultando elementos de los documentos antes de cargarlos, lo que puede aumentar la superficie de memoria general de Visual Studio.
Carga de documentos
El marco de código auxiliar y el documento se inicializan completamente cuando el usuario accede al documento, por ejemplo, seleccionando la pestaña del marco de la ventana. El documento también se puede inicializar mediante una extensión que solicite los datos del documento, ya sea accediendo directamente al RDT para adquirir los datos del documento o accediendo a RDT indirectamente mediante una de las siguientes llamadas:
Método de marco Show de ventana.
Método de marco GetProperty de ventana en cualquiera de las propiedades siguientes:
Si la extensión usa código administrado, no debe llamar a GetDocumentInfo a menos que esté seguro de que el documento no está en el estado de inicialización pendiente o desea que el documento se inicialice completamente. El motivo es que el método siempre devuelve el objeto de datos de documento, lo que lo crea si es necesario. En su lugar, debe llamar a uno de los métodos de la
IVsRunningDocumentTable4
interfaz .Si la extensión usa C++, puede pasar
null
los parámetros que no desee.Puede evitar la carga innecesaria de documentos llamando a uno de los métodos siguientes antes de solicitar las propiedades pertinentes antes de solicitar otras propiedades:
GetProperty usar __VSFPROPID6. VSFPROPID_PendingInitialization.
GetDocumentFlags. Este método devuelve un _VSRDTFLAGS4 objeto que incluye un valor para _VSRDTFLAGS4. RDT_PendingInitialization si el documento aún no se ha inicializado.
Puede averiguar cuándo se ha cargado un documento mediante la suscripción al evento RDT que se genera cuando se inicializa un documento por completo. Hay dos posibilidades:
Si el receptor de eventos IVsRunningDocTableEvents2implementa , puede suscribirse a OnAfterAttributeChangeEx,
De lo contrario, puede suscribirse a OnAfterAttributeChange.
El ejemplo siguiente es un escenario hipotético de acceso a documentos: una extensión de Visual Studio quiere mostrar información sobre documentos abiertos, por ejemplo, el recuento de bloqueos de edición y algo sobre los datos del documento. Enumera los documentos del RDT mediante IEnumRunningDocumentsy, a continuación, llama GetDocumentInfo a para cada documento para recuperar el recuento de bloqueos de edición y los datos del documento. Si el documento está en estado de inicialización pendiente, la solicitud de los datos del documento hace que se inicialice innecesariamente.
Una forma más eficaz de acceder a un documento es usar GetDocumentEditLockCount para obtener el recuento de bloqueos de edición y, a continuación, usar GetDocumentFlags para determinar si el documento se ha inicializado. Si las marcas no incluyen _VSRDTFLAGS4. RDT_PendingInitialization, el documento ya se ha inicializado y la solicitud de los datos del documento con GetDocumentData no provoca ninguna inicialización innecesaria. Si las marcas incluyen _VSRDTFLAGS4. RDT_PendingInitialization, la extensión debe evitar solicitar los datos del documento hasta que se inicialice el documento. Esta inicialización se puede detectar en el controlador de OnAfterAttributeChange(Ex)
eventos.
Probar extensiones para ver si fuerzan la inicialización
No hay ninguna indicación visible para indicar si se ha inicializado un documento, por lo que puede ser difícil averiguar si la extensión está forzando la inicialización. Puede establecer una clave del Registro que facilite la comprobación, ya que hace que el título de cada documento que no se inicialice completamente tenga el texto [código auxiliar] en el título.
En HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoad, establezca StubTabTitleFormatString en {0} [Stub].