Verzögertes Laden von Dokumenten
Wenn ein Benutzer eine Visual Studio-Projektmappe erneut öffnet, werden die meisten zugehörigen Dokumente nicht sofort geladen. Der Dokumentfensterrahmen wird in einem Ausstehend-Initialisierungszustand erstellt, und ein Platzhalterdokument (als Stubrahmen bezeichnet) wird in der Tabelle "Running Document" (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
IVsRunningDocumentTable4
Schnittstelle aufrufen.Wenn Ihre Erweiterung C++ verwendet, können Sie die gewünschten Parameter übergeben
null
.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 IVsRunningDocTableEvents2implementiert wird, können Sie ,OnAfterAttributeChangeEx
Andernfalls können OnAfterAttributeChangeSie 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 IEnumRunningDocumentsvon RDT auf und ruft dann für jedes Dokument auf GetDocumentInfo , um die Anzahl der Bearbeitungssperren und Dokumentdaten abzurufen. Wenn sich das Dokument im Zustand der ausstehenden Initialisierung befindet, wird das Anfordern der Dokumentdaten unnötig initialisiert.
Eine effizientere Möglichkeit für den Zugriff auf ein Dokument besteht darin GetDocumentEditLockCount , die Anzahl der Bearbeitungssperren abzurufen und dann GetDocumentFlags zu bestimmen, ob das Dokument initialisiert wurde. Wenn die Kennzeichnungen nicht _VSRDTFLAGS4 enthalten . RDT_PendingInitialization, wurde das Dokument bereits initialisiert, und das Anfordern der Dokumentdaten mit GetDocumentData keinem unnötigen Initialisierungsaufwand verursacht. Wenn die Kennzeichnungen _VSRDTFLAGS4 enthalten . RDT_PendingInitialization sollte die Erweiterung das Anfordern der Dokumentdaten vermeiden, bis das Dokument initialisiert wird. 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.
Legen Sie in HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoad stubTabTitleFormatString auf{0} [Stub] fest.