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ń:
Metoda ramki Show okna.
Metoda ramki GetProperty okna dla dowolnej z następujących właściwości:
Jeśli rozszerzenie używa kodu zarządzanego, nie należy wywoływać GetDocumentInfo , chyba że masz pewność, że dokument nie znajduje się w stanie oczekujących inicjowania lub chcesz, aby dokument był w pełni zainicjowany. Przyczyną jest to, że metoda zawsze zwraca obiekt danych dokumentu, tworząc go w razie potrzeby. Zamiast tego należy wywołać jedną z metod w interfejsie
IVsRunningDocumentTable4
.Jeśli rozszerzenie używa języka C++, możesz przekazać
null
parametry, których nie potrzebujesz.Aby uniknąć niepotrzebnego ładowania dokumentu, wywołaj jedną z następujących metod, zanim poprosisz o odpowiednie właściwości przed wyświetleniem zapytania o inne właściwości:
GetProperty __VSFPROPID6 . VSFPROPID_PendingInitialization.
GetDocumentFlags. Ta metoda zwraca _VSRDTFLAGS4 obiekt, który zawiera wartość _VSRDTFLAGS4 . RDT_PendingInitialization, jeśli dokument nie został jeszcze zainicjowany.
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:
Jeśli ujście zdarzeń implementuje IVsRunningDocTableEvents2element , możesz zasubskrybować usługę OnAfterAttributeChangeEx,
W przeciwnym razie możesz zasubskrybować usługę OnAfterAttributeChange.
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].