Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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ń:
Metoda Show ramki 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 oczekiwania na inicjalizację albo chcesz, aby został 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ć
nullparametry, 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 za pomocą __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, poprzez subskrybowanie zdarzenia RDT, które jest zgłaszane, kiedy dokument zostanie w pełni zainicjowany. Istnieją dwie możliwości:
Jeśli odbiornik zdarzeń implementuje element IVsRunningDocTableEvents2, możesz zasubskrybować do 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 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].