Freigeben über


RDT_ReadLock-Verwendung

_VSRDTFLAGS.RDT_ReadLock ist ein Flag, das eine Logik zum Sperren eines Dokuments in der Tabelle der laufenden Dokumente (RDT) bereitstellt. RDT ist die Liste aller Dokumente, die derzeit in der Visual Studio IDE geöffnet sind. Dieses Flag bestimmt, wann Dokumente geöffnet werden und ob ein Dokument in der Benutzeroberfläche sichtbar ist oder unsichtbar im Speicher gehalten wird.

Im Allgemeinen verwenden Sie _VSRDTFLAGS.RDT_ReadLock, wenn eine der folgenden Bedingungen erfüllt ist:

  • Sie möchten ein Dokument unsichtbar und schreibgeschützt öffnen, aber es ist noch nicht festgelegt, welcher IVsHierarchy es besitzen soll.

  • Sie möchten, dass der Benutzer aufgefordert wird, ein Dokument zu speichern, das unsichtbar geöffnet wurde, bevor der Benutzer es in der Benutzeroberfläche angezeigt hat und dann versucht hat, es zu schließen.

Verwalten von sichtbaren und unsichtbaren Dokumenten

Wenn ein Benutzer ein Dokument in der Benutzeroberfläche öffnet, muss ein IVsHierarchy-Besitzer für das Dokument festgelegt und ein _VSRDTFLAGS.RDT_EditLock-Flag gesetzt werden. Wenn kein IVsHierarchy-Besitzer ermittelt werden kann, wird das Dokument nicht gespeichert, wenn der Benutzer auf Alles speichern klickt oder die IDE schließt. Das heißt, wenn ein Dokument unsichtbar geöffnet ist, wo es im Speicher geändert wird, und der Benutzer aufgefordert wird, das Dokument beim Beenden zu speichern oder zu speichern, wenn Alles speichern gewählt wird, dann kann kein RDT_ReadLock verwendet werden. Stattdessen müssen Sie einen RDT_EditLock und einen IVsDocumentLockHolder registrieren, wenn ein __VSREGDOCLOCKHOLDER.RDLH_WeakLockHolder Flag gesetzt ist.

RDT_EditLock und Dokumentänderung

Das zuvor erwähnte Flag zeigt an, dass das unsichtbare Öffnen des Dokuments zu RDT_EditLock führt, wenn das Dokument vom Benutzer in einem sichtbaren DocumentWindow geöffnet wird. In diesem Fall erhält der Benutzer eine Aufforderung zum Speichern, wenn das sichtbare DocumentWindow geschlossen wird. Microsoft.VisualStudio.Package.Automation.OAProject.CodeModel-Implementierungen, die den IVsInvisibleEditorManager-Dienst nutzen, funktionieren zunächst, wenn nur ein RDT_ReadLock genommen wird (d. h. wenn das Dokument unsichtbar geöffnet wird, um Informationen zu parsen). Wenn das Dokument später geändert werden muss, wird die Sperre in eine schwache RDT_EditLock-Sperre umgewandelt. Wenn der Benutzer dann das Dokument in einem sichtbaren DocumentWindow öffnet, wird CodeModels RDT_EditLock ist schwach freigegeben.

Wenn der Benutzer dann das DocumentWindow schließt und Nein wählt, wenn er aufgefordert wird, das geöffnete Dokument zu speichern, entsorgt die CodeModel-Implementierung alle Informationen im Dokument und öffnet das Dokument unsichtbar erneut von der Festplatte, wenn das nächste Mal mehr Informationen für das Dokument benötigt werden. Die Subtilität dieses Verhaltens ist eine Instanz, in der der Benutzer das DocumentWindow des unsichtbaren offenen Dokuments öffnet, es ändert, schließt und dann Nein wählt, wenn er aufgefordert wird, das Dokument zu speichern. Wenn das Dokument in diesem Fall ein RDT_ReadLock enthält, wird das Dokument nicht wirklich geschlossen und das geänderte Dokument bleibt unsichtbar im Speicher geöffnet, auch wenn der Benutzer das Dokument nicht gespeichert hat.

Wenn das unsichtbare Öffnen des Dokuments eine schwache RDT_EditLock verwendet, dann gibt es seine Sperre auf, wenn der Benutzer das Dokument sichtbar öffnet und keine anderen Sperren gehalten werden. Wenn der Benutzer das DocumentWindow schließt und Nein wählt, wenn er aufgefordert wird, das Dokument zu speichern, muss das Dokument aus dem Speicher geschlossen werden. Das bedeutet, dass der unsichtbare Client auf RDT-Ereignisse warten muss, um dieses Ereignis zu verfolgen. Wenn das Dokument das nächste Mal benötigt wird, muss es erneut geöffnet werden.