Document chargement différéDelayed Document Loading

Lorsqu’un utilisateur ouvre de nouveau une solution Visual Studio, la plupart des documents associés n’est pas chargée immédiatement.When a user reopens a Visual Studio solution, most of the associated documents are not loaded immediately. Le frame de fenêtre de document est créé dans un état en attente de l’initialisation, et un document d’espace réservé (appelé un frame de stub) est placé dans la Table de Document en cours d’exécution (r & DT).The document window frame is created in a pending-initialization state, and a placeholder document (called a stub frame) is placed in the Running Document Table (RDT).

Votre extension peut entraîner des documents du projet à charger inutilement en interrogeant les éléments dans les documents avant leur chargement.Your extension may cause project documents to be loaded unnecessarily by querying elements in the documents before they are loaded. Cela peut augmenter l’encombrement mémoire de Visual Studio.This can increase the overall memory footprint for Visual Studio.

Lors du chargement du documentDocument Loading

Le document et le frame de stub sont entièrement initialisés lorsque l’utilisateur accède au document, par exemple en sélectionnant l’onglet de la fenêtre frame.The stub frame and document are fully initialized when the user accesses the document, for example by selecting the tab of the window frame. Le document peut également être initialisé par une extension qui demande les données du document, soit en accédant à la r & DT directement pour acquérir les données du document, ou accéder à la r & DT indirectement en effectuant une des appels suivants :The document can also be initialized by an extension that requests the document's data, either by accessing the RDT directly to acquire the document data, or accessing the RDT indirectly by making one of the following calls:

  • Le frame de fenêtre show (méthode) : Show.The window frame show method: Show.

  • Le frame de fenêtre méthode GetProperty GetProperty sur l’une des propriétés suivantes :The window frame GetProperty method GetProperty on any of the following properties:

    Si votre extension utilise du code managé, vous ne devez pas appeler GetDocumentInfo , sauf si vous êtes certain que le document n’est pas dans l’état en attente de l’initialisation ou que vous souhaitez que le document soit entièrement initialisé...If your extension uses managed code, you should not call GetDocumentInfo unless you are certain that the document is not in the pending-initialization state, or you want the document to be fully initialized.. Il s’agit, car cette méthode retourne toujours le document objet de données, créant si nécessaire.This is because this method always returns the doc data object, creating it if necessary. Au lieu de cela, vous devez appeler une des méthodes sur l’interface IVsRunningDocumentTable4.Instead, you should call one of the methods on the IVsRunningDocumentTable4 interface.

    Si votre extension utilise C++, vous pouvez passer null pour les paramètres que vous ne souhaitez pas.If your extension uses C++, you can pass null for the parameters you don't want.

    Vous pouvez éviter le chargement de documents inutiles en appelant une des méthodes suivantes avant de vous demandez les propriétés pertinentes : avant de demander à d’autres propriétés.You can avoid unnecessary document loading by calling one of the following methods before you ask for the relevant properties: before you ask for other properties.

  • GetProperty à l’aide de __VSFPROPID6.GetProperty using __VSFPROPID6.

  • GetDocumentFlags.GetDocumentFlags. Cette méthode retourne un _VSRDTFLAGS4 objet qui inclut une valeur pour _VSRDTFLAGS4 si le document n’a pas encore été initialisé.This method returns a _VSRDTFLAGS4 object that includes a value for _VSRDTFLAGS4 if the document has not yet been initialized.

    Vous pouvez déterminer si un document a été chargé en vous abonnant à l’événement de r & DT qui est déclenché lorsqu’un document est entièrement initialisé.You can find out when a document has been loaded by subscribing to the RDT event that is raised when a document is fully initialized. Il existe deux possibilités :There are two possibilities:

  • Si le récepteur d’événements implémente IVsRunningDocTableEvents2, vous pouvez vous abonner à OnAfterAttributeChangeEx,If the event sink implements IVsRunningDocTableEvents2, you can subscribe to OnAfterAttributeChangeEx,

  • Sinon, vous pouvez vous abonner à OnAfterAttributeChange.Otherwise, you can subscribe to OnAfterAttributeChange.

    Voici un scénario d’accès de document hypothétique.The following is a hypothetical document access scenario. Visual Studio extension souhaitez affiche des informations sur les documents ouverts, par exemple la modification verrouiller nombre et des informations sur les données du document.A Visual Studio extension want to display some information about open documents, for instance the edit lock count and something about the document data. Il énumère les documents dans l’à l’aide de r & DT IEnumRunningDocuments, puis appelle GetDocumentInfo pour chaque document afin de récupérer les données de document et le nombre de verrouillage modifier.It enumerates the documents in the RDT using IEnumRunningDocuments, then calls GetDocumentInfo for each document in order to retrieve the edit lock count and document data. Si le document est dans l’état en attente de l’initialisation, qui demande les données de document fait à initialiser inutilement.If the document is in the pending-initialization state, requesting the document data causes it to be unnecessarily initialized.

    Un moyen plus efficace de cette opération consiste à utiliser GetDocumentEditLockCount pour obtenir le nombre de verrous de modification, puis utiliser GetDocumentFlags pour déterminer si le document a été initialisé.A more efficient way of doing this is to use GetDocumentEditLockCount to get the edit lock count, and then use GetDocumentFlags to determine whether the document has been initialized. Si les indicateurs n’incluent pas _VSRDTFLAGS4, le document a déjà été initialisé et demande les données de document avec GetDocumentData n’entraîne pas de toute initialisation inutile.If the flags do not include _VSRDTFLAGS4, the document has already been initialized ,and requesting the document data with GetDocumentData does not cause any unnecessary initialization. Si les indicateurs incluent _VSRDTFLAGS4, l’extension doit éviter de demande les données de document jusqu'à ce que le document est initialisé.If the flags do include _VSRDTFLAGS4, the extension should avoid requesting the document data until the document is initialized. Cela peut être détectée dans le Gestionnaire d’événements OnAfterAttributeChange(Ex).This can be detected in the OnAfterAttributeChange(Ex) event handler.

Tester des extensions pour voir si elles forcer l’initialisationTesting extensions to see if they force initialization

Il n’existe aucun indice visuel pour indiquer si un document a été initialisé, donc il peut être difficile de savoir si votre extension est forçant.There is no visible cue to indicate whether a document has been initialized, so it can be difficult to find out if your extension is forcing initialization. Vous pouvez définir une clé de Registre qui facilite la vérification, car elle force le titre de tous les documents qui ne sont pas entièrement initialisé pour que le texte [Stub] dans le titre.You can set a registry key that makes verification easier, because it causes the title of every document that is not fully initialized to have the text [Stub] in the title.

Dans HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoad], définissez StubTabTitleFormatString à {0} [Stub].In HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoad], set StubTabTitleFormatString to {0} [Stub].