Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 de inicialização pendente e um documento de espaço reservado (chamado de quadro stub) é colocado na tabela Documento 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 volume de memória geral para o Visual Studio.
Carregamento de documentos
O quadro e o documento do stub são totalmente inicializados quando o usuário acessa o documento, por exemplo, selecionando a aba da moldura da janela. O documento também pode ser inicializado por uma extensão que solicita os dados do documento, acessando o RDT diretamente para adquirir os dados do documento ou acessando o RDT indiretamente fazendo uma das seguintes chamadas:
O método de moldura da janela Show.
O método de moldura da janela GetProperty em uma das seguintes propriedades:
Se a extensão usar código gerenciado, você não deverá chamar GetDocumentInfo a menos que tenha certeza de que o documento não está no estado de inicialização pendente ou se deseja que o documento seja totalmente inicializado. O motivo é porque o método sempre retorna o objeto de dados doc, criando-o, se necessário. Em vez disso, você deve chamar um dos métodos na
IVsRunningDocumentTable4interface.Se sua extensão usar C++, você poderá passar
nullpara os parâmetros que não deseja.Você pode evitar o carregamento desnecessário de documentos chamando um dos seguintes métodos antes de solicitar as propriedades relevantes antes de solicitar outras propriedades:
GetProperty usando __VSFPROPID6.VSFPROPID_PendingInitialization.
GetDocumentFlags. Esse método retorna um _VSRDTFLAGS4 objeto que inclui um valor para _VSRDTFLAGS4. RDT_PendingInitialization se o documento ainda não tiver sido inicializado.
Você pode descobrir quando um documento está carregado inscrevendo-se no evento RDT gerado quando um documento é totalmente inicializado. Há duas possibilidades:
Se o receptor de eventos implementar IVsRunningDocTableEvents2, você poderá inscrever-se em OnAfterAttributeChangeEx,
Ou então, você poderá assinar OnAfterAttributeChange.
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 bloqueios de edição e algo sobre os dados do documento. Ele enumera os documentos no RDT usando IEnumRunningDocuments, em seguida, chama GetDocumentInfo para cada documento, a fim de recuperar a contagem de bloqueios 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 bloqueios de edição e, em seguida, usar GetDocumentFlags para determinar se o documento foi inicializado. Se os sinalizadores 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 além da necessária. Se os sinalizadores 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 detectada no OnAfterAttributeChange(Ex) manipulador de eventos.
Testar extensões para ver se elas forçam a inicialização
Não há nenhuma indicação visível para indicar se um documento foi inicializado, portanto, pode ser difícil descobrir se a extensão está forçando a inicialização. Você pode definir uma chave do Registro que facilita a verificação, pois ela faz com que o título de cada documento que não está totalmente inicializado tenha o texto [Stub] no título.
Em HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoad, defina StubTabTitleFormatString como {0} [Stub].