Chargement différé du document

Lorsqu’un utilisateur rouvre une solution Visual Studio, la plupart des documents associés ne sont pas chargés immédiatement. Le cadre de la fenêtre de document est créé dans un état d’initialisation en attente, et un document d’espace réservé (appelé frame stub) est placé dans la table RdT (Running Document Table).

Votre extension peut entraîner le chargement inutile de documents de projet en interrogeant inutilement les éléments des documents avant leur chargement, ce qui peut augmenter l’empreinte mémoire globale pour Visual Studio.

Chargement de documents

Le frame stub et le document sont entièrement initialisés lorsque l’utilisateur accède au document, par exemple en sélectionnant l’onglet du cadre de fenêtre. Le document peut également être initialisé par une extension qui demande les données du document, soit en accédant directement au RDT pour acquérir les données du document, soit en accédant indirectement au RDT en effectuant l’un des appels suivants :

Vous pouvez savoir quand un document a été chargé en vous abonnant à l’événement RDT déclenché lorsqu’un document est entièrement initialisé. Il existe deux possibilités :

L’exemple suivant est un scénario d’accès hypothétique aux documents : une extension Visual Studio souhaite afficher des informations sur les documents ouverts, par exemple le nombre de verrous de modification et quelque chose sur les données du document. Il énumère les documents du RDT à l’aide IEnumRunningDocumentsde , puis appelle GetDocumentInfo chaque document pour récupérer le nombre de verrous de modification et les données de document. Si le document est dans l’état d’initialisation en attente, la demande de données de document entraîne son initialisation inutile.

Un moyen plus efficace d’accéder à un document consiste à GetDocumentEditLockCount obtenir le nombre de verrous d’édition, puis GetDocumentFlags à déterminer si le document a été initialisé. Si les indicateurs n’incluent pas _VSRDTFLAGS4. RDT_PendingInitialization, le document a déjà été initialisé et la demande de données de document avec GetDocumentData n’entraîne aucune initialisation inutile. Si les indicateurs incluent _VSRDTFLAGS4. RDT_PendingInitialization, l’extension doit éviter de demander les données du document jusqu’à ce que le document soit initialisé. Cette initialisation peut être détectée dans le gestionnaire d’événements OnAfterAttributeChange(Ex) .

Tester les extensions pour voir s’ils forcent l’initialisation

Il n’existe aucun indicateur visible pour indiquer si un document a été initialisé. Il peut donc être difficile de déterminer si votre extension force l’initialisation. Vous pouvez définir une clé de Registre qui facilite la vérification, car elle entraîne le titre de chaque document qui n’est pas entièrement initialisé pour avoir le texte [Stub] dans le titre.

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