Uso de RDT_ReadLock
_VSRDTFLAGS.RDT_ReadLock é um sinalizador que fornece lógica para bloquear um documento na Running Document Table (RDT), que é a lista de todos os documentos que estão atualmente abertos no IDE do Visual Studio. Esse sinalizador determina quando os documentos são abertos e se um documento é visível na interface do usuário ou mantido invisivelmente na memória.
Geralmente, você usa _VSRDTFLAGS.RDT_ReadLock quando uma das seguintes situações for verdadeira:
Você deseja abrir um documento de forma invisível e somente leitura, mas ainda não estabeleceu qual IVsHierarchy deve possuí-lo.
Você deseja que o usuário seja solicitado a salvar um documento que foi aberto invisivelmente antes de exibi-lo na interface do usuário e, em seguida, tentou fechá-lo.
Como gerenciar documentos visíveis e invisíveis
Quando um usuário abre um documento na interface do usuário, um proprietário de IVsHierarchy para o documento deve ser estabelecido e um sinalizador _VSRDTFLAGS.RDT_EditLock deve ser definido. Se nenhum proprietário de IVsHierarchy puder ser estabelecido, o documento não será salvo quando o usuário clicar em Salvar tudo ou fechar o IDE. Isso significa que, se um documento estiver aberto invisivelmente onde ele é modificado na memória e o usuário for solicitado a salvar o documento no desligamento ou salvo se Salvar tudo for escolhido, um RDT_ReadLock
não poderá ser usado. Em vez disso, você deve usar um RDT_EditLock
e registrar um IVsDocumentLockHolder quando um __VSREGDOCLOCKHOLDER.RDLH_WeakLockHolder for sinalizado.
RDT_EditLock e Modificação de Documentos
O sinalizador mencionado anteriormente indica que a abertura invisível do documento produzirá seu RDT_EditLock
quando o documento for aberto pelo usuário em uma DocumentWindow visível. Quando isso ocorre, o usuário recebe uma solicitação Salvar quando a DocumentWindow visível for fechada. As implementações de Microsoft.VisualStudio.Package.Automation.OAProject.CodeModel
que usam o serviço IVsInvisibleEditorManager funcionam inicialmente quando apenas um RDT_ReadLock
é tomado (ou seja, quando o documento é aberto invisivelmente para analisar informações). Mais tarde, se o documento precisar ser modificado, o bloqueio será atualizado para um RDT_EditLock fraco. Se o usuário abrir o documento em uma DocumentWindow visível, o CodeModel
fraco de RDT_EditLock
será liberado.
Se o usuário fechar a DocumentWindow e escolher Não quando solicitado a salvar o documento aberto, a implementação CodeModel
eliminará todas as informações no documento e reabrirá o documento do disco invisivelmente na próxima vez que mais informações forem necessárias para o documento. A sutileza desse comportamento é uma situação em que o usuário abre a DocumentWindow do documento aberto invisível, modifica-o, fecha-o e, em seguida, escolhe Não quando solicitado a salvar o documento. Nesse caso, se o documento tiver um RDT_ReadLock
, o documento não será realmente fechado e o documento modificado permanecerá aberto invisivelmente na memória, mesmo que o usuário tenha optado por não salvar o documento.
Se a abertura invisível do documento usa um RDT_EditLock
fraco, então ele produz seu bloqueio quando o usuário abre o documento visivelmente e nenhum outro bloqueio é mantido. Quando o usuário fecha a DocumentWindow e escolhe Não quando solicitado a salvar o documento, o documento deve ser fechado da memória. Isso significa que o cliente invisível deve escutar eventos RDT para rastrear essa ocorrência. Na próxima vez que o documento for exigido, ele deverá ser reaberto.