Partilhar via


Atraso no carregamento de documentos

Quando um usuário reabre uma solução do Visual Studio, a maioria dos documentos associados não são carregados imediatamente. O quadro da janela do documento é criado em um estado pendente de inicialização e um documento de espaço reservado (chamado de quadro provisório) é colocado na Tabela de Documentos em Execução (RDT).

Sua extensão pode fazer com que os documentos do projeto sejam carregados desnecessariamente consultando elementos nos documentos antes de serem carregados, o que pode aumentar o espaço de memória geral para o Visual Studio.

Carregamento de documentos

O quadro de esboço e o documento são totalmente inicializados quando o usuário acessa o documento, por exemplo, selecionando a guia do quadro da janela. O documento também pode ser inicializado por uma extensão que solicita os dados do documento, seja acessando o RDT diretamente para adquirir os dados do documento, seja acessando o RDT indiretamente fazendo uma das seguintes chamadas:

Você pode descobrir quando um documento foi carregado ao subscrever o evento RDT, que é gerado quando um documento está totalmente inicializado. Existem duas possibilidades:

O exemplo a seguir é um cenário hipotético de acesso a documentos: Uma extensão do Visual Studio deseja exibir algumas informações sobre documentos abertos, por exemplo, a contagem de bloqueio de edição e algo sobre os dados do documento. Enumera os documentos no RDT usando IEnumRunningDocuments e, em seguida, chama GetDocumentInfo para cada documento, a fim de recuperar a contagem de bloqueio de edição e os dados do documento. Se o documento estiver no estado de inicialização pendente, solicitar os dados do documento fará com que ele seja inicializado desnecessariamente.

Uma maneira mais eficiente de acessar um documento é usar GetDocumentEditLockCount para obter a contagem de bloqueio de edição e, em seguida, usar GetDocumentFlags para determinar se o documento foi inicializado. Se as bandeiras não incluírem _VSRDTFLAGS4. RDT_PendingInitialization, o documento já foi inicializado, e solicitar os dados do documento com GetDocumentData não causa nenhuma inicialização desnecessária. Se as bandeiras incluírem _VSRDTFLAGS4.RDT_PendingInitialization, a extensão deve evitar solicitar os dados do documento até que o documento seja inicializado. Essa inicialização pode ser detetada no manipulador de OnAfterAttributeChange(Ex) eventos.

Testar extensões para ver se elas forçam a inicialização

Não há nenhuma pista visível para indicar se um documento foi inicializado, portanto, pode ser difícil descobrir se sua extensão está forçando a inicialização. Você pode definir uma chave do Registro que facilita a verificação, pois faz com que o título de cada documento que não é totalmente inicializado tenha o texto [Stub] no título.

Em HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoad, defina StubTabTitleFormatString como {0} [Stub].