Freigeben über


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 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:

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:

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.