ドキュメントの読み込みの遅延
ユーザーが Visual Studio ソリューションを再び開くと、関連付けられているドキュメントのほとんどはすぐに読み込まれません。 ドキュメント ウィンドウ フレームは、保留中の初期化状態で作成され、プレースホルダー ドキュメント (スタブ フレームと呼ばれます) が実行中のドキュメント テーブル (RDT) に配置されます。
拡張機能を使用すると、読み込まれる前にドキュメント内の要素に対してクエリを実行することで、プロジェクト ドキュメントが不必要に読み込まれる可能性があります。これで、Visual Studio のメモリ占有領域全体が増加する可能性があります。
ドキュメントの読み込み
スタブ フレームとドキュメントは、ユーザーがたとえばウィンドウ フレームのタブを選択してドキュメントにアクセスしたときに、完全に初期化されます。 ドキュメントは、ドキュメント データを取得するために RDT に直接アクセスするか、次のいずれかの呼び出しを行って間接的に RDT にアクセスすることで、ドキュメントのデータを要求する拡張機能によって初期化することもできます。
ウィンドウ フレームの Show メソッド。
次のいずれかのプロパティのウィンドウ フレーム GetProperty メソッド。
拡張機能でマネージド コードを使用するときは、ドキュメントが保留中の初期化状態でないことがわかっているか、ドキュメントを完全に初期化する必要がある場合を除き、GetDocumentInfo を呼び出さないでください。 その理由は、メソッドによって常にドキュメント データ オブジェクトが返され、必要に応じて作成されるためです。 代わりに、
IVsRunningDocumentTable4
インターフェイスでいずれかのメソッドを呼び出す必要があります。拡張機能で C++ が使用されている場合は、必要のないパラメーターで
null
を渡すことができます。他のプロパティを要求する前に、関連するプロパティを要求する前に、次のいずれかのメソッドを呼び出すことによって、不要なドキュメントの読み込みを回避できます。
__VSFPROPID6.VSFPROPID_PendingInitialization を使用する GetProperty。
GetDocumentFlags= このメソッドでは、ドキュメントがまだ初期化されていない場合に _VSRDTFLAGS4.RDT_PendingInitialization の値を含む _VSRDTFLAGS4 オブジェクトを返します。
ドキュメントが読み込まれたタイミングは、ドキュメントが完全に初期化されたときに発生する RDT イベントをサブスクライブすることによって確認できます。 次の 2 つの可能性があります。
イベント シンクで 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] に設定します。