Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn ein Benutzer eine Visual Studio-Projektmappe erneut öffnet, werden die meisten zugehörigen Dokumente nicht sofort geladen. Der Dokumentfensterrahmen wird in einem ausstehendem Initialisierungszustand erstellt, und ein Platzhalterdokument (als Platzhalterrahmen bezeichnet) wird in der Tabelle "Laufende Dokumente" (RDT) platziert.
Die Erweiterung kann dazu führen, dass Projektdokumente unnötig geladen werden, indem Sie Elemente in den Dokumenten abfragen, bevor sie geladen werden, wodurch der gesamte Speicherbedarf für Visual Studio erhöht werden kann.
Laden von Dokumenten
Der Stubrahmen und das Dokument werden vollständig initialisiert, wenn der Benutzer auf das Dokument zugreift, z. B. durch Auswählen der Registerkarte des Fensterrahmens. Das Dokument kann auch durch eine Erweiterung initialisiert werden, die die Daten des Dokuments anfordert, entweder durch den direkten Zugriff auf das RDT zum Abrufen der Dokumentdaten oder indirekten Zugriff auf das RDT durch einen der folgenden Aufrufe:
Die Fensterrahmenmethode Show .
Die Fensterrahmenmethode GetProperty für eine der folgenden Eigenschaften:
Wenn Ihre Erweiterung verwalteten Code verwendet, sollten Sie nicht aufrufen GetDocumentInfo , es sei denn, Sie sind sicher, dass sich das Dokument nicht im Zustand der ausstehenden Initialisierung befindet oder dass das Dokument vollständig initialisiert werden soll. Der Grund dafür ist, dass die Methode immer das Doc-Datenobjekt zurückgibt und es ggf. erstellt. Stattdessen sollten Sie eine der Methoden auf der
IVsRunningDocumentTable4Schnittstelle aufrufen.Wenn Ihre Erweiterung C++ verwendet, können Sie für die Parameter, die Sie nicht verwenden möchten,
nullweitergeben.Sie können unnötiges Laden von Dokumenten vermeiden, indem Sie eine der folgenden Methoden aufrufen, bevor Sie die relevanten Eigenschaften anfordern, bevor Sie andere Eigenschaften anfordern:
GetProperty verwenden __VSFPROPID6.VSFPROPID_PendingInitialization.
GetDocumentFlags. Diese Methode gibt ein _VSRDTFLAGS4 Objekt zurück, das einen Wert für _VSRDTFLAGS4 enthält. RDT_PendingInitialization , wenn das Dokument noch nicht initialisiert wurde.
Sie können herausfinden, wann ein Dokument geladen wurde, indem Sie das RDT-Ereignis abonnieren, das ausgelöst wird, wenn ein Dokument vollständig initialisiert wird. Es gibt zwei Möglichkeiten:
Wenn die Ereignissenke IVsRunningDocTableEvents2 implementiert, können Sie sich bei OnAfterAttributeChangeEx anmelden.
Andernfalls können Sie auf OnAfterAttributeChange abonnieren.
Das folgende Beispiel ist ein hypothetisches Dokumentzugriffsszenario: Eine Visual Studio-Erweiterung möchte einige Informationen zu geöffneten Dokumenten anzeigen, z. B. die Anzahl der Bearbeitungssperren und etwas über die Dokumentdaten. Sie listet die Dokumente im RDT mithilfe von IEnumRunningDocuments auf und ruft dann GetDocumentInfo für jedes Dokument auf, um die Anzahl der Bearbeitungssperren und Dokumentdaten abzurufen. Wenn sich das Dokument im Zustand der ausstehenden Initialisierung befindet, führt das Anfordern der Dokumentdaten zur unnötigen Initialisierung des Dokuments.
Eine effizientere Methode des Dokumentzugriffs besteht darin, GetDocumentEditLockCount zu verwenden, um die Anzahl der Bearbeitungssperren abzurufen und anschließend GetDocumentFlags zu nutzen, um zu bestimmen, ob das Dokument initialisiert wurde. Wenn die Flags _VSRDTFLAGS4.RDT_PendingInitialization nicht enthalten, ist das Dokument bereits initialisiert worden, und das Anfordern der Dokumentdaten mit GetDocumentData verursacht keine unnötige Initialisierung. Wenn die Flags _VSRDTFLAGS4.RDT_PendingInitialization enthalten, sollte die Erweiterung die Anforderung von Dokumentdaten vermeiden, bis das Dokument initialisiert ist. Diese Initialisierung kann im OnAfterAttributeChange(Ex) Ereignishandler erkannt werden.
Testen von Erweiterungen, um festzustellen, ob sie die Initialisierung erzwingen
Es gibt keinen sichtbaren Hinweis, um anzugeben, ob ein Dokument initialisiert wurde, sodass es schwierig sein kann, herauszufinden, ob die Erweiterung die Initialisierung erzwingt. Sie können einen Registrierungsschlüssel festlegen, der die Überprüfung vereinfacht, da der Titel jedes Dokuments, das nicht vollständig initialisiert ist, den Text [Stub] im Titel hat.
In HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoad legen Sie StubTabTitleFormatString auf {0} [Stub] fest.