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:
Metodo cornice Show finestra.
Metodo cornice GetProperty finestra in una delle proprietà seguenti:
Se l'estensione usa codice gestito, non è consigliabile chiamare GetDocumentInfo a meno che non si sia certi che il documento non si trovi nello stato di inizializzazione in sospeso oppure si vuole che il documento sia completamente inizializzato. Il motivo è che il metodo restituisce sempre l'oggetto dati doc, creandolo, se necessario. È invece necessario chiamare uno dei metodi nell'interfaccia
IVsRunningDocumentTable4
.Se l'estensione usa C++, è possibile passare
null
per i parametri non desiderati.È possibile evitare il caricamento di documenti non necessari chiamando uno dei metodi seguenti prima di richiedere le proprietà pertinenti prima di richiedere altre proprietà:
GetProperty utilizzando __VSFPROPID6. VSFPROPID_PendingInitialization.
GetDocumentFlags. Questo metodo restituisce un _VSRDTFLAGS4 oggetto che include un valore per _VSRDTFLAGS4. RDT_PendingInitialization se il documento non è ancora stato inizializzato.
È possibile scoprire quando un documento è stato caricato sottoscrivendo l'evento RDT generato quando un documento viene inizializzato completamente. Esistono due possibilità:
Se il sink di eventi implementa IVsRunningDocTableEvents2, è possibile sottoscrivere OnAfterAttributeChangeEx,
In caso contrario, è possibile sottoscrivere OnAfterAttributeChange.
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].