COM コンテキスト遷移の試行中にデッドロックが検出されると、contextSwitchDeadlock マネージ デバッグ アシスタント (MDA) がアクティブになります。
症状
最も一般的な症状は、マネージ コードからのアンマネージ COM コンポーネントの呼び出しが返されないことです。もう 1 つの症状は、時間の経過とともにメモリ使用量が増加することです。
原因
最も可能性の高い原因は、シングル スレッド アパートメント (STA) スレッドがメッセージをポンピングしていないことです。STA スレッドが、メッセージをポンピングせずに待機しているか、時間のかかる操作を実行しており、メッセージ キューのポンピングを許可していません。
時間の経過とともにメモリ使用量が増加するのは、ファイナライザー スレッドがアンマネージ COM コンポーネントで Release を呼び出そうとし、そのコンポーネントが返されないことが原因です。これにより、ファイナライザーが他のオブジェクトを再利用できなくなります。
デフォルトでは、Visual Basic コンソール アプリケーションのメイン スレッドのスレッド モデルは STA です。この MDA は、STA スレッドが共通言語ランタイムまたはサードパーティ コントロールを介して直接的または間接的に COM 相互運用性を使用する場合にアクティブ化されます。Visual Basic コンソール アプリケーションでこの MDA をアクティブにしないようにするには、MTAThreadAttribute 属性をメイン メソッドに適用するか、メッセージをポンプするようにアプリケーションを変更します。
次の条件がすべて満たされると、この MDA が誤ってアクティブ化される可能性があります。
· アプリケーションは、STA スレッドから直接またはライブラリを介して間接的に COM コンポーネントを作成します。
· アプリケーションがデバッガで停止され、ユーザーがアプリケーションを続行するか、ステップ操作を実行しました。
· アンマネージ デバッグが有効になっていません。
MDA が誤ってアクティブ化されているかどうかを判断するには、すべてのブレークポイントを無効にし、アプリケーションを再起動して、停止せずに実行できるようにします。MDA がアクティブ化されていない場合は、最初のアクティブ化が誤っていた可能性があります。この場合、MDA を無効にして、デバッグ セッションへの干渉を回避します。
解像度
STA メッセージ ポンピングに関する COM ルールに従います。
これらのエラー ポップアップが表示されないようにするには、Visual Studio ウィンドウの [デバッグ] メニューから [例外] を選択し、[例外] ダイアログ ボックスで [マネージド デバッグ アシスタント] 例外ノードを選択します。次に、ContextSwitchDeadlock を選択し、Thrown 列から選択を削除します。
実行を高速化する方法:
それを行うには多くの方法があります
テーブルに不足しているインデックスを作成します。
このテーブルにインデックス付きビューを作成します。
データ範囲に基づいてテーブルを分割することもできます。
このテーブルを別のディスクに配置して、データの読み取り/書き込みが高速になるようにします。