次の方法で共有


contextSwitchDeadlock MDA

Note

この記事は .NET Framework に固有のものです。 .NET 6 以降のバージョンを含む、.NET の新しい実装には適用されません。

contextSwitchDeadlock マネージド デバッグ アシスタント (MDA) は、COM コンテキストの遷移の試行中にデッドロックが検出されるとアクティブ化されます。

現象

最も一般的な症状は、マネージド コードから実行されたアンマネージド COM コンポーネントの呼び出しから戻らないことです。 別の症状として、メモリの使用量が時間と共に増加する場合もあります。

原因

最も考えられる原因として、シングルスレッド アパートメント (STA) スレッドがメッセージ ポンプを行っていないことがあります。 STA スレッドが、メッセージ ポンプを行わずに待機しているか、または時間のかかる操作を実行していて、メッセージ キューのポンプを許可していません。

メモリ使用量が時間の経過と共に増加する症状は、ファイナライザー スレッドがアンマネージ COM コンポーネント上の Release を呼び出そうとして、そのコンポーネントが戻らない場合に発生します。 このため、ファイナライザーは他のオブジェクトを再利用できなくなります。

既定では、Visual Basic コンソール アプリケーションのメイン スレッドのスレッド処理モデルは STA です。 STA スレッドが共通言語ランタイムまたはサードパーティ コントロールを通じて COM 相互運用性を直接または間接的に使用する場合、この MDA がアクティブ化されます。 Visual Basic コンソール アプリケーションでこの MDA がアクティブ化されるのを防ぐには、メイン メソッドに MTAThreadAttribute 属性を適用するか、またはメッセージをポンプするようにアプリケーションを変更します。

次のすべての条件が満たされる場合、この MDA が誤ってアクティブ化される可能性があります。

  • アプリケーションがライブラリを通じて直接または間接的に STA スレッドから COM コンポーネントを作成する。

  • デバッガーでアプリケーションが中断され、ユーザーがアプリケーションを続行したか、またはステップ操作を実行した。

  • アンマネージ デバッグが有効になっていない。

MDA が誤ってアクティブ化されたかどうかを判断するには、すべてのブレークポイントを無効にし、アプリケーションを再び実行して、中断なしで実行させます。 MDA がアクティブ化されない場合は、最初のアクティブ化は誤りだった可能性があります。 その場合は、MDA を無効にして、デバッグ セッションとの干渉を防ぎます。

Note

この MDA は、Visual Studio の既定のセットに含まれています。 MDA を無効にする方法については、「マネージド デバッグ アシスタントによるエラーの診断」を参照してください。

解決方法

STA メッセージ ポンプに関する COM 規則に従います。

ランタイムへの影響

この MDA は CLR に影響しません。 COM コンテキストに関するデータを報告するだけです。

出力

現在のコンテキストおよびターゲット コンテキストを説明するメッセージです。

構成

<mdaConfig>
  <assistants>
    <contextSwitchDeadlock />
  </assistants>
</mdaConfig>

関連項目