Udostępnij za pośrednictwem


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 oczekujących inicjowania, a dokument zastępczy (nazywany ramką wycinkową) jest umieszczany w tabeli Running Document (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 przez subskrybowanie zdarzenia RDT, które jest zgłaszane, gdy dokument jest 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 on dokumenty w RDT przy użyciu metody 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 oczekującej inicjowania, żądanie danych dokumentu powoduje niepotrzebne zainicjowanie go.

Bardziej wydajnym sposobem uzyskiwania dostępu do dokumentu jest użycie GetDocumentEditLockCount metody w celu uzyskania liczby blokad edycji, a następnie użycie polecenia GetDocumentFlags w celu określenia, czy dokument został zainicjowany. Jeśli flagi nie zawierają _VSRDTFLAGS4. RDT_PendingInitialization dokument został już zainicjowany i żądanie danych dokumentu za GetDocumentData pomocą polecenia 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 tytuł każdego dokumentu, który nie jest w pełni zainicjowany, aby tekst [stub] był w tytule.

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