「ContextSwitchDeadlock」への対処方法

CLR は、COM コンテキスト 0x** から COM コンテキスト 0x** へ 60 秒で移行できませんでした。ターゲット コンテキストおよびアパートメントを所有するスレッドが、ポンプしない待機を行っているか、Windows のメッセージを表示しないで非常に長い実行操作を処理しているかのどちらかです。この状態は通常、パフォーマンスを低下させたり、アプリケーションが応答していない状態および増え続けるメモリ使用を導く可能性があります。この問題を回避するには、すべての Single Thread Apartment (STA) のスレッドが、CoWaitForMultipleHandles のようなポンプする待機プリミティブを使用するか、長い実行操作中に定期的にメッセージをポンプしなければなりません。」というエラーが検出されることがあります。

これはアンマネージドCOMコンポーネントの処理に、時間がかかっているのが原因です。contextSwitchDeadlock MDA | MSDN

解決方法

1. スレッドを分ける

スレッドを作成してそこで処理させることで、現在のスレッドで待機することがなくなります。

2. メッセージをポンプする (message pump)

定期的にApplication.DoEvents()を呼び出すことで、メッセージ キューにある処理を実行させられます。

Microsoft Learnから検索