Chargement de document 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 (RDT).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 de projet à charger inutilement en interrogeant les éléments dans les documents avant qu’ils sont chargés, ce qui peuvent augmenter l’encombrement de mémoire globale pour Visual Studio.Your extension may cause project documents to be loaded unnecessarily by querying elements in the documents before they are loaded, which can increase the overall memory footprint for Visual Studio.

Chargement de documentDocument loading

Le document et le frame de stub sont entièrement initialisées lorsque l’utilisateur accède au document, par exemple en sélectionnant l’onglet du frame de fenêtre.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 des données du document, soit en accédant à la RDT directement pour acquérir les données de document, ou accéder à la table RDT indirectement en définissant un 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).The window frame Show method.

  • Le frame de fenêtre GetProperty méthode sur une des propriétés suivantes :The window frame GetProperty method 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. La raison est que la méthode retourne toujours la documentation de l’objet de données, créant si nécessaire.The reason is because the method always returns the doc data object, creating it if necessary. Au lieu de cela, vous devez appeler une des méthodes sur le IVsRunningDocumentTable4 interface.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 en appelant une des méthodes suivantes avant de lui demander pour les propriétés pertinentes avant de lui demander d’autres propriétés de document inutile :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:

Vous pouvez déterminer à quel moment un document a été chargé en vous abonnant à l’événement RDT 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:

L’exemple suivant est un scénario d’accès de document hypothétique : extension A Visual Studio souhaite afficher des informations sur les documents ouverts, par exemple la modification verrouiller les nombre et des informations sur les données du document.The following example is a hypothetical document access scenario: A Visual Studio extension wants 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 le RDT à l’aide IEnumRunningDocuments, puis appelle GetDocumentInfo pour chaque document afin de récupérer les données de nombre et le document 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 d’accéder à un document consiste à utiliser GetDocumentEditLockCount pour obtenir le nombre de verrous de modification et puis GetDocumentFlags pour déterminer si le document a été initialisé.A more efficient way of accessing a document 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 qui 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 demander les données du 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. Cette initialisation peut être détectée dans le OnAfterAttributeChange(Ex) Gestionnaire d’événements.This initialization can be detected in the OnAfterAttributeChange(Ex) event handler.

Extensions pour voir si elles forcer l’initialisation de testTest extensions to see if they force initialization

Il n’existe aucun indice visible pour indiquer si un document a été initialisé, 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, affectez la valeur StubTabTitleFormatString à {0} [Stub].In HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoad, set StubTabTitleFormatString to {0} [Stub].