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