Visual Studio:ContextSwitchDeadlock


167

解決できないエラーメッセージが表示されます。Visual Studioまたはデバッガーから発生します。最終的なエラー状態がVS、デバッガー、プログラム、データベースのどれにあるのかわかりません。

これはWindowsアプリです。Webアプリではありません。

VSからの最初のメッセージは、「呼び出しスタックフレームにシンボルが読み込まれていません。ソースコードを表示できません。」というポップアップボックスです。クリックすると、「ContextSwitchDeadlockが検出されました」と、以下に再現された長いメッセージが表示されます。

エラーは、DataTableをスキャンするループで発生します。各行について、テーブルのキー(HIC#)値をSqlCommandのパラメーターとして使用します。このコマンドは、1行を返すSqlDataReaderを作成するために使用されます。データが比較されます。エラーが検出されると、行が2番目のDataTableに追加されます。

エラーは、プロシージャの実行にかかる時間(つまり60秒後)に関連しているようであり、エラーの数ではありません。メモリの問題ではないと思います。ループ内では変数は宣言されていません。作成される唯一のオブジェクトはSqlDataReadersで、構造体の使用にあります。Add System.GC.Collect()は効果がありませんでした。

dbは、同じラップトップ上のSqlServerサイトです。

フォームには派手なギズモやガジェットはありません。

私は以前に何十回もやったこととは大きく異なるこのprocの何も知りません。私は以前にエラーを見たことがありますが、一貫してではありません。

何かアイデアはありますか?

完全なエラーテキスト: CLRは、COMコンテキスト0x1a0b88からCOMコンテキスト0x1a0cf8に60秒間遷移できませんでした。宛先のコンテキスト/アパートメントを所有するスレッドは、ほとんどの場合、非ポンプ待機を実行しているか、Windowsメッセージをポンプ送信せずに非常に長時間実行されている操作を処理しています。この状況は通常、パフォーマンスに悪影響を及ぼし、アプリケーションが応答しなくなったり、メモリ使用量が時間の経過とともに継続的に蓄積したりする可能性があります。この問題を回避するには、すべてのシングルスレッドアパートメント(STA)スレッドでポンピング待機プリミティブ(CoWaitForMultipleHandlesなど)を使用し、長時間実行される操作中に定期的にメッセージをポンピングする必要があります。

回答:


287

これContextSwitchDeadlockは必ずしもコードに問題があることを意味するのではなく、潜在的な可能性があるということだけです。あなたがに行く場合はDebug > Exceptions、メニューにして展開するManaged Debugging Assistants、あなたは見つけるでしょうContextSwitchDeadlock有効になっています。これを無効にすると、アイテムの処理に長い時間がかかっても、VSは警告を表示しなくなります。場合によっては、長時間実行オペレーションが有効になることがあります。また、デバッグ中に、これが処理中にラインで停止した場合にも役立ちます。問題を掘り下げる前に、文句を言われたくない場合があります。


4
右に!ありがとう。[カスタマイズ]に移動して、[デバッグ]メニューに例外を追加する必要がありました。UIの最も直感的な側面ではありません。Tools \ Customize、次にコマンドの再配置(ボタン)、右上のドロップダウンから[デバッグ]を選択し、次に[追加](ボタン)。ふew!
SeaDrive 2009

81
ctrl-alt-e例外ダイアログを表示します。
フローリアンドヨン

1
Visual Studioの最新バージョン(2012、2010、2008)の多くと、場合によっては以前のバージョンでは、インストール後にVisual Studioを最初に実行するときに、Visual Studioの主な用途を選択できます。その選択によって、表示または非表示にするコントロール、およびどのキーストロークがどのコマンドに対応するかなど、ツールバーのデフォルトのレイアウトが決まります。VS 2010では、設定のインポートおよびエクスポートウィザードを使用して、使用可能なデフォルトの1つにリセットできます。
Zarepheth 2013

4
@ B.ClayShannon-ContextSwitchDeadlockはデバッガーに固有です。exeのリリースバージョンでは、このメッセージは表示されません。
ペドロ

9
VS 2013では、でナビゲートしDebug -> Windows -> Exceptions Settingsます。次に、検索を使用します
Markus Weber

16

Pedroが言ったように、コードをステップ実行している場合、デバッガーにメッセージポンプを妨げる問題があります。

ただし、UIスレッドで実行時間の長い操作を実行している場合は、Application.DoEvents()を呼び出して、メッセージキューを明示的にポンプし、現在のメソッドに制御を返します。

ただし、これを実行している場合は、UIスレッドから処理を実行できるようにデザインを確認して、UIが見栄えがよく、きちんとしたままになるようにすることをお勧めします。


14

アプリのメインUIスレッドでこれを行っているようです。UIスレッドは、Windowsメッセージが到着したときにポンプすることを担当しますが、データベース呼び出しでブロックされているため、実行できません。これにより、システム全体のメッセージで問題が発生する可能性があります。

長時間実行される操作のためにバックグラウンドスレッドを生成し、それが発生している間、ユーザーに対してある種の「忙しい」ダイアログを表示することを検討する必要があります。


13

Visual Studio 2017では、次のようにしてContextSwitchDeadlockオプションをオフにしました。

デバッグ>ウィンドウ>例外設定

ここに画像の説明を入力してください

例外設定ウィンドウ:ContextSwitchDeadlockオプションのチェックを外します

ここに画像の説明を入力してください


9

この例外を無効にしたくない場合は、少なくとも60秒に1回、アプリケーションにメッセージを送信させるだけです。この例外が発生するのを防ぎます。時々System.Threading.Thread.CurrentThread.Join(10)を呼び出してみてください。メッセージを送り込むことができる他の呼び出しがあります。


これがなぜ役立つのか説明していただけますか?
ロール

これは機能しません。UIを更新するループがあり、それでもエラーメッセージが表示されます。
htm11h

1
10ミリ秒の値を使用する必要はありません。実際、長時間実行する操作で繰り返し呼び出す場合は、全体的なパフォーマンス(合計実行時間)が大幅に低下します。ゼロを渡すだけです。
ElektroStudios 2018

同様の問題がありました。ソリューションが機能していることがわかりました。ありがとう!
Sk Shahnawaz-ul Haque

2

上記の解決策はいくつかのシナリオで有効ですが、ソリューションがデバッグに設定されていないときに単体テストを行っているときにテストエクスプローラーから「選択したテストをデバッグ」しようとすると、別のシナリオが発生します。

この場合、ソリューションをリリースまたはこの場合デバッグに設定されているものから変更する必要があります。これが問題である場合、「ContextSwitchDeadlock」を変更しても実際には役に立ちません。

エラーメッセージがひどいので、デバッグ設定である明らかなことをチェックしなかったので、私はこれを逃しました!


1

Visual Studio 2017スペイン語版。

"Depurar"-> "Ventanas"-> "Configuraciónde Excepciones"

「ContextSwitchDeadlock」を検索します。次に、チェックを外します。またはショートカット

Ctrl + D、E

ベスト。


0

あなたはcontextswitchdeadlockのチェックを外すことでこれを解決できます

デバッグ->例外...-> MDAノードを展開->オフ-> contextswitchdeadlock


0

このエラーが発生し、クエリを非同期に切り替えました(待機(...)。ToListAsync())。すべて順調です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.