Udostępnij przez


Opóźnione ładowanie dokumentu

Gdy użytkownik ponownie otworzy rozwiązanie programu Visual Studio, większość skojarzonych dokumentów nie jest ładowana natychmiast. Ramka okna dokumentu jest tworzona w stanie oczekiwania na inicjalizację, a dokument zastępczy (nazywany ramką stub) jest umieszczany w tabeli Uruchomionych Dokumentów (RDT).

Rozszerzenie może spowodować niepotrzebne załadowanie dokumentów projektu przez wykonywanie zapytań dotyczących elementów w dokumentach przed ich załadowaniem, co może zwiększyć całkowity rozmiar pamięci dla programu Visual Studio.

Ładowanie dokumentu

Ramka wycinkowa i dokument są w pełni inicjowane, gdy użytkownik uzyskuje dostęp do dokumentu, na przykład wybierając kartę ramki okna. Dokument może być również inicjowany przez rozszerzenie, które żąda danych dokumentu, przez uzyskanie dostępu do RDT bezpośrednio w celu uzyskania danych dokumentu lub uzyskiwanie dostępu do RDT pośrednio przez wykonanie jednego z następujących wywołań:

Możesz dowiedzieć się, kiedy dokument został załadowany, poprzez subskrybowanie zdarzenia RDT, które jest zgłaszane, kiedy dokument zostanie w pełni zainicjowany. Istnieją dwie możliwości:

W poniższym przykładzie przedstawiono hipotetyczny scenariusz dostępu do dokumentów: rozszerzenie programu Visual Studio chce wyświetlić pewne informacje o otwartych dokumentach, na przykład liczbę blokad edycji i informacje o danych dokumentu. Wylicza dokumenty w RDT za pomocą IEnumRunningDocuments, a następnie wywołuje GetDocumentInfo dla każdego dokumentu w celu pobrania liczby blokad edycji i danych dokumentu. Jeśli dokument znajduje się w stanie oczekiwania na inicjalizację, wystąpienie o dane dokumentu powoduje niepotrzebną jego inicjalizację.

Bardziej efektywnym sposobem dostępu do dokumentu jest użycie GetDocumentEditLockCount do uzyskania licznika blokad edycji, a następnie użycie GetDocumentFlags w celu określenia, czy dokument został zainicjowany. Jeśli flagi nie zawierają _VSRDTFLAGS4.RDT_PendingInitialization, dokument był już zainicjowany i zażądanie danych dokumentu za pomocą GetDocumentData nie powoduje niepotrzebnego inicjowania. Jeśli flagi zawierają _VSRDTFLAGS4. RDT_PendingInitialization rozszerzenie powinno unikać żądania danych dokumentu do momentu zainicjowania dokumentu. Tę inicjację można wykryć w procedurze obsługi zdarzeń OnAfterAttributeChange(Ex) .

Testowanie rozszerzeń w celu sprawdzenia, czy wymuszają inicjowanie

Nie ma widocznych wskazówek wskazujących, czy dokument został zainicjowany, więc trudno jest sprawdzić, czy rozszerzenie wymusza inicjowanie. Można ustawić klucz rejestru, który ułatwia weryfikację, ponieważ powoduje, że tytuł każdego dokumentu, który nie jest w pełni zainicjowany, zawiera tekst [Stub].

W HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoadustaw wartość StubTabTitleFormatString na {0} wartość [Stub].