Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 de cadre de fenêtre Show.
Méthode cadre de fenêtre GetProperty sur n’importe laquelle 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 du document, 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
nullpour les paramètres que vous ne souhaitez pas.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 en utilisant __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, il est possible de s’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 de IEnumRunningDocuments, puis appelle GetDocumentInfo pour chaque document afin de récupérer le nombre de verrous de modification et les données du 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 est d’utiliser GetDocumentEditLockCount pour obtenir le nombre de verrous d'édition, puis d’utiliser GetDocumentFlags pour 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é du Registre qui facilite la vérification, car elle entraîne le titre de chaque document qui n’est pas entièrement initialisé à contenir le texte [Stub] dans le titre.
Dans HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoad, définissez StubTabTitleFormatString sur {0} [Stub].