Condividi tramite


Caricamento ritardato dei documenti

Quando un utente riapre una soluzione di Visual Studio, la maggior parte dei documenti associati non viene caricata immediatamente. La cornice della finestra del documento viene creata in uno stato di inizializzazione in sospeso e un documento segnaposto (denominato frame stub) viene inserito nella tabella Documento in esecuzione (RDT).

L'estensione può causare il caricamento dei documenti di progetto inutilmente eseguendo query sugli elementi nei documenti prima del caricamento, aumentando così il footprint di memoria complessivo per Visual Studio.

Caricamento di documenti

La cornice stub e il documento vengono inizializzati completamente quando l'utente accede al documento, ad esempio selezionando la scheda della cornice della finestra. Il documento può anche essere inizializzato da un'estensione che richiede i dati del documento, accedendo direttamente a RDT per acquisire i dati del documento o accedendo indirettamente a RDT effettuando una delle chiamate seguenti:

È possibile scoprire quando un documento è stato caricato sottoscrivendo l'evento RDT generato quando un documento viene inizializzato completamente. Esistono due possibilità:

L'esempio seguente è uno scenario ipotetico di accesso ai documenti: un'estensione di Visual Studio vuole visualizzare alcune informazioni sui documenti aperti, ad esempio il conteggio dei blocchi di modifica e qualcosa sui dati del documento. Enumera i documenti in RDT usando IEnumRunningDocuments, quindi chiama GetDocumentInfo per ogni documento per recuperare il conteggio dei blocchi di modifica e i dati del documento. Se il documento si trova nello stato di inizializzazione in sospeso, richiedendo i dati del documento, verrà inizializzato inutilmente.

Un modo più efficiente per accedere a un documento consiste nell'usare GetDocumentEditLockCount per ottenere il conteggio dei blocchi di modifica e quindi usare GetDocumentFlags per determinare se il documento è stato inizializzato. Se i flag non includono _VSRDTFLAGS4. RDT_PendingInitialization, il documento è già stato inizializzato e la richiesta dei dati del documento con GetDocumentData non causa alcuna inizializzazione non necessaria. Se i flag includono _VSRDTFLAGS4. RDT_PendingInitialization, l'estensione deve evitare di richiedere i dati del documento fino all'inizializzazione del documento. Questa inizializzazione può essere rilevata nel OnAfterAttributeChange(Ex) gestore eventi.

Testare le estensioni per verificare se forzano l'inizializzazione

Non esiste alcun segnale visibile per indicare se un documento è stato inizializzato, quindi può essere difficile scoprire se l'estensione forza l'inizializzazione. È possibile impostare una chiave del Registro di sistema che semplifica la verifica, perché fa sì che il titolo di ogni documento non completamente inizializzato abbia il testo [Stub] nel titolo.

In HKEY_CURRENT_Uedizione Standard R\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoad impostare StubTabTitleFormatString su {0} [Stub].