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 :
Méthode frame Show de fenêtre.
Méthode frame GetProperty de fenêtre sur l’une des propriétés suivantes :
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 d’initialisation en attente ou que vous souhaitez que le document soit entièrement initialisé. La raison est que la méthode retourne toujours l’objet de données doc, en le créant si nécessaire. Au lieu de cela, vous devez appeler l’une des méthodes sur l’interface
IVsRunningDocumentTable4
.Si votre extension utilise C++, vous pouvez passer les paramètres souhaités
null
.Vous pouvez éviter le chargement inutile de documents en appelant l’une des méthodes suivantes avant de demander les propriétés pertinentes avant de demander d’autres propriétés :
GetProperty utilisation de __VSFPROPID6. VSFPROPID_PendingInitialization.
GetDocumentFlags. Cette méthode retourne un _VSRDTFLAGS4 objet qui inclut une valeur pour _VSRDTFLAGS4. RDT_PendingInitialization si le document n’a pas encore été initialisé.
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 :
Si le récepteur d’événements implémente IVsRunningDocTableEvents2, vous pouvez vous abonner à OnAfterAttributeChangeEx,
Sinon, vous pouvez vous abonner à OnAfterAttributeChange.
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].