Udostępnij przez


użycie RDT_ReadLock

_VSRDTFLAGS. RDT_ReadLock to flaga zapewniająca logikę blokowania dokumentu w tabeli uruchomionych dokumentów (RDT), która jest listą wszystkich dokumentów, które są obecnie otwarte w środowisku IDE programu Visual Studio. Ta flaga określa, kiedy dokumenty są otwierane i czy dokument jest widoczny w interfejsie użytkownika, czy przechowywany w pamięci.

Ogólnie rzecz biorąc, należy użyć _VSRDTFLAGS. RDT_ReadLock , gdy spełniony jest jeden z następujących warunków:

  • Chcesz otworzyć dokument w sposób niewidoczny i tylko do odczytu, ale nie został jeszcze ustalony, który IVsHierarchy powinien być jego właścicielem.

  • Chcesz, aby użytkownik był monitowany o zapisanie dokumentu, który został przypadkowo otwarty, zanim użytkownik wyświetlił go w interfejsie użytkownika, a następnie próbował go zamknąć.

Jak zarządzać widocznymi i niewidocznymi dokumentami

Gdy użytkownik otworzy dokument w interfejsie użytkownika, IVsHierarchy należy ustanowić właściciela dokumentu i _VSRDTFLAGS. RDT_EditLock musi być ustawiona flaga. Jeśli nie IVsHierarchy można ustanowić właściciela, dokument nie zostanie zapisany, gdy użytkownik kliknie pozycję Zapisz wszystko lub zamknie środowisko IDE. Oznacza to, że jeśli dokument jest otwarty w sposób niewidoczny, gdzie jest modyfikowany w pamięci, a użytkownik jest monitowany o zapisanie dokumentu po zamknięciu lub zapisaniu, jeśli wybrano opcję Zapisz wszystko , nie RDT_ReadLock można go użyć. Zamiast tego należy użyć elementu RDT_EditLock i zarejestrować IVsDocumentLockHolder obiekt, gdy __VSREGDOCLOCKHOLDER. RDLH_WeakLockHolder flaga.

RDT_EditLock i modyfikacja dokumentu

Wymieniona wcześniej flaga wskazuje, że niewidoczne otwarcie dokumentu spowoduje jego otwarcie RDT_EditLock , gdy dokument zostanie otwarty przez użytkownika w widocznym dokumencieWindow. W takim przypadku użytkownik jest wyświetlany z monitem Zapisz po zamknięciu widocznego elementu DocumentWindow . Microsoft.VisualStudio.Package.Automation.OAProject.CodeModel implementacje korzystające z IVsInvisibleEditorManager usługi początkowo działają, gdy tylko element RDT_ReadLock jest pobierany (tj. gdy dokument jest otwierany w sposób niewidoczny, aby przeanalizować informacje). Później, jeśli dokument musi zostać zmodyfikowany, blokada zostanie uaktualniona do słabej RDT_EditLock. Jeśli użytkownik otworzy dokument w widocznym dokumencieWindow, CodeModelzostanie zwolniony słaby RDT_EditLock .

Jeśli użytkownik zamknie okno DocumentWindow i wybierze pozycję Nie po wyświetleniu monitu o zapisanie otwartego dokumentu, CodeModel implementacja usuwa wszystkie informacje w dokumencie i ponownie otwiera dokument z dysku, gdy następnym razem więcej informacji jest wymaganych dla dokumentu. Subtelność tego zachowania to wystąpienie, w którym użytkownik otwiera dokumentWindow niewidocznego otwartego dokumentu, modyfikuje go, zamyka go, a następnie wybiera pozycję Nie po wyświetleniu monitu o zapisanie dokumentu. W takim przypadku, jeśli dokument ma RDT_ReadLockwartość , dokument nie zostanie zamknięty, a zmodyfikowany dokument pozostanie niewidoczny w pamięci, mimo że użytkownik nie zdecydował się zapisać dokumentu.

Jeśli niewidoczne otwarcie dokumentu używa słabego RDT_EditLockelementu , wówczas zwraca blokadę, gdy użytkownik otwiera dokument wyraźnie i nie są przechowywane żadne inne blokady. Gdy użytkownik zamknie element DocumentWindow i wybierze pozycję Nie po wyświetleniu monitu o zapisanie dokumentu, dokument musi zostać zamknięty z pamięci. Oznacza to, że niewidoczny klient musi nasłuchiwać zdarzeń RDT w celu śledzenia tego wystąpienia. Przy następnym wymaganym dokumencie należy ponownie otworzyć dokument.