Compartir a través de


Uso de RDT_ReadLock

_VSRDTFLAGS.RDT_ReadLock es una marca que proporciona lógica para bloquear un documento en la tabla de documentos en ejecución (RDT), que es la lista de todos los documentos que están abiertos actualmente en el IDE de Visual Studio. Esta marca determina cuándo se abren documentos y si un documento está visible en la interfaz de usuario o se mantiene invisible en la memoria.

Por lo general, _VSRDTFLAGS.RDT_ReadLock se usa cuando se cumple una de las siguientes condiciones:

  • Desea abrir un documento de forma invisible y de solo lectura, pero aún no se ha establecido el IVsHierarchy que debe tener propiedad sobre él.

  • Desea que se le pida al usuario que guarde un documento que se abrió de forma invisible antes de que el usuario lo mostrara en la interfaz de usuario y, a continuación, intentara cerrarlo.

Cómo administrar documentos visibles e invisibles

Cuando un usuario abre un documento en la interfaz de usuario, se debe establecer un propietario IVsHierarchy del documento y configurar una marca _VSRDTFLAGS.RDT_EditLock. Si no se puede establecer ningún propietario IVsHierarchy, el documento no se guardará cuando el usuario haga clic en Guardar todo o cuando cierre el IDE. Esto significa que si un documento está abierto de forma invisible donde se modifica en la memoria y se pide al usuario que guarde el documento al apagar o que lo guarde si elige Guardar todo, no será posible utilizar RDT_ReadLock. En su lugar, debe utilizar un RDT_EditLock y registrar un objeto IVsDocumentLockHolder cuando haya una marca __VSREGDOCLOCKHOLDER.RDLH_WeakLockHolder.

RDT_EditLock y modificación de documentos

La marca mencionada anteriormente indica que la apertura invisible del documento dará lugar a su RDT_EditLock cuando el usuario abra el documento en un objeto DocumentWindow visible. Cuando esto ocurre, se presenta al usuario una solicitud Guardar cuando se cierra el DocumentWindow visible. Las implementaciones Microsoft.VisualStudio.Package.Automation.OAProject.CodeModel que utilizan el servicio IVsInvisibleEditorManager funcionan inicialmente cuando solo se toma una implementación RDT_ReadLock (es decir, cuando el documento se abre de forma invisible para analizar la información). Más adelante, si se debe modificar el documento, el bloqueo se actualiza a un RDT_EditLock débil. Si el usuario abre el documento en un DocumentWindow visible, se libera la RDT_EditLock débil de CodeModel.

Si el usuario cierra DocumentWindow y elige No cuando se le pide que guarde el documento abierto, la implementación CodeModel elimina toda la información del documento y lo vuelve a abrir desde el disco de forma invisible la próxima vez que se requiera más información para el documento. La sutileza de este comportamiento es una instancia en la que el usuario abre el DocumentWindow del documento abierto invisible, lo modifica, lo cierra y, a continuación, elige No cuando se le pide que guarde el documento. En este caso, si el documento tiene un RDT_ReadLock, el documento no se cerrará realmente y el documento modificado permanecerá abierto de forma invisible en la memoria, aunque el usuario haya elegido no guardarlo.

Si la apertura invisible del documento utiliza un valor RDT_EditLock débil, genera su bloqueo cuando el usuario abre el documento visiblemente y no se mantiene ningún otro bloqueo. Si el usuario cierra DocumentWindow y elige No cuando se le pide que guarde el documento, este documento debe cerrarse desde la memoria. Esto significa que el cliente invisible debe escuchar eventos RDT para realizar el seguimiento correspondiente. La próxima vez que se requiera el documento, deberá volver a abrirse.