web-dev-qa-db-ja.com

Visual Studio:ContextSwitchDeadlock

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

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

VSからの最初のメッセージは、「コールスタックフレームにシンボルがロードされていません。ソースコードを表示できません」というポップアップボックスです。クリックすると、「ContextSwitchDeadlock was detected」と以下の長いメッセージが表示されます。

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

このエラーは、見つかったエラーの数ではなく、プロシージャの実行時間(60秒後)に関連しているようです。私はそれがメモリの問題だとは思わない。ループ内で変数は宣言されていません。作成されるオブジェクトはSqlDataReadersのみであり、「構造の使用」にあります。 System.GC.Collect()を追加しても効果はありませんでした。

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

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

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

アイデアはありますか?

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

149
SeaDrive

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

253
Pedro

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

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

ただし、これを実行している場合は、UIスレッドの処理を実行してUIが素晴らしく、きちんと維持されるように、デザインを確認することをお勧めします。

15
Spence

アプリのメインUIスレッドでこれを実行しているようです。 UIスレッドは、到着時にWindowsメッセージをポンピングする役割を果たしますが、データベースコールでブロックされるため、そうすることはできません。これは、システム全体のメッセージで問題を引き起こす可能性があります。

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

13
Rob Walker

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

6
rold2007

上記のソリューションは一部のシナリオでは適切ですが、単体テストを実行しているときに別のシナリオがあり、ソリューションがデバッグに設定されていないときにテストエクスプローラから「選択したテストのデバッグ」を試みます。

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

エラーメッセージが非常に厄介だったので、デバッグ設定である明白なものをチェックしなかったので、私は自分でこれを逃しました!

1
Ewan

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

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

enter image description here

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

enter image description here

0
Hassan Rahman

これを解決するには、contextswitchdeadlockのチェックを外します

デバッグ->例外...-> MDAノードを展開->チェック解除-> contextswitchdeadlock

0
KR Akhil

Visual Studio 2017スペイン語版。

「Depurar」->「Ventanas」->「Configuraciónde Excepciones」

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

Ctrl + D、E

ベスト。

0
kahonmlg