지연된 문서 로드
사용자가 Visual Studio 솔루션을 다시 열면 연결된 문서는 대부분 즉시 로드되지 않습니다. 문서 창 프레임은 초기화 대기 중 상태로 만들어지고 자리 표시자 문서(스텁 프레임이라고 함)는 RDT(실행 중인 문서 테이블)에 배치됩니다.
확장으로 인해 프로젝트 문서가 로드 전에 문서의 요소를 쿼리하여 불필요하게 로드될 수 있으므로 Visual Studio가 차지하는 전체 메모리 공간이 증가할 수 있습니다.
문서 로드
스텁 프레임과 문서는 사용자가 문서에 액세스할 때(예: 창 프레임의 탭을 선택) 완전히 초기화됩니다. 문서 데이터를 가져오기 위해 RDT에 직접 액세스하거나 다음 중 하나를 호출하여 RDT에 간접적으로 액세스하여 문서의 데이터를 요청하는 확장으로 문서를 초기화할 수도 있습니다.
창 프레임 Show 메서드.
다음 속성에 대한 창 프레임 GetProperty 메서드.
확장에서 관리 코드를 사용하는 경우 문서가 초기화 대기 중 상태가 아닌 것이 확실하거나 문서를 완전히 초기화하려는 경우가 아니면 GetDocumentInfo를 호출하면 안 됩니다. 그 이유는 메서드가 항상 doc 데이터 개체를 반환하여 필요한 경우 이 데이터 개체를 만들기 때문입니다. 대신
IVsRunningDocumentTable4
인터페이스에서 메서드 중 하나를 호출해야 합니다.확장에서 C++를 사용하는 경우 원하지 않는 매개 변수에 대해
null
을 전달할 수 있습니다.다른 속성을 요청하기 전 관련 속성을 요청하기 전에 다음 메서드 중 하나를 호출하여 불필요한 문서 로드를 방지할 수 있습니다.
__VSFPROPID6.VSFPROPID_PendingInitialization을 사용하여 GetProperty.
GetDocumentFlags. 이 메서드는 문서가 아직 초기화되지 않은 경우 _VSRDTFLAGS4.RDT_PendingInitialization 값이 포함된 _VSRDTFLAGS4 개체를 반환합니다.
문서가 완전히 초기화될 때 발생하는 RDT 이벤트를 구독하여 문서가 로드된 시기를 확인할 수 있습니다. 다음과 같은 두 가지 가능성이 있습니다.
이벤트 싱크에서 IVsRunningDocTableEvents2를 구현하는 경우 OnAfterAttributeChangeEx를 구독할 수 있습니다.
그렇지 않으면 OnAfterAttributeChange를 구독할 수 있습니다.
다음 예제는 가상의 문서 액세스 시나리오입니다. Visual Studio 확장은 열려 있는 문서에 대한 일부 정보(예: 편집 잠금 수 및 문서 데이터에 대한 정보)를 표시하려고 합니다. IEnumRunningDocuments를 사용하여 RDT의 문서를 열거한 다음, 편집 잠금 수 및 문서 데이터를 검색하기 위해 각 문서에 대해 GetDocumentInfo를 호출합니다. 문서가 초기화 대기 중 상태인 경우 문서 데이터를 요청하면 문서가 불필요하게 초기화됩니다.
문서에 액세스하는 보다 효율적인 방법은 GetDocumentEditLockCount를 사용하여 편집 잠금 수를 가져오고 GetDocumentFlags를 사용하여 문서가 초기화되었는지 확인하는 것입니다. 플래그에 _VSRDTFLAGS4.RDT_PendingInitialization가 포함되지 않은 경우 문서가 이미 초기화된 것이며 GetDocumentData를 사용하여 문서 데이터를 요청해도 불필요한 초기화가 발생하지 않습니다. 플래그에 _VSRDTFLAGS4.RDT_PendingInitialization이 포함된 경우 확장은 문서가 초기화될 때까지 문서 데이터를 요청하지 않아야 합니다. 이 초기화는 OnAfterAttributeChange(Ex)
이벤트 처리기에서 감지할 수 있습니다.
확장을 테스트하여 강제로 초기화되는지 확인
문서가 초기화되었는지 여부를 나타내는 시각적 신호가 없으므로 확장이 강제로 초기화되는지 확인하기 어려울 수 있습니다. 완전히 초기화되지 않은 모든 문서는 제목에 텍스트 [Stub]을 포함하게 되므로 확인을 더 쉽게 만드는 레지스트리 키를 설정할 수 있습니다.
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoad에서 StubTabTitleFormatString을 {0} [Stub]으로 설정합니다.