1. ホーム
  2. シーピー

ContextSwitchDeadlockが検出された

2022-02-27 06:02:07
<パス

エラーメッセージ


ContextSwitchDeadlockが検出されました。
メッセージ CLR は COM コンテキスト 0x622b440 から COM コンテキスト 0x622b5b0 に切り替えることができず、この状態が 60 秒間持続しました。対象のコンテキスト/ユニットを所有するスレッドは、Windowsメッセージを送信せずに非ポンプ待ちを実行しているか、非常に長く実行されている処理を処理している可能性が高いです。このような状況は通常パフォーマンスに影響し、アプリケーションが応答しなくなったり、時間と共に蓄積されるメモリを使用したりする可能性さえあります。この問題を回避するには、すべてのシングルスレッド・ユニット(STA)スレッドでポンプ待機プリミティブ(CoWaitForMultipleHandlesなど)を使用し、非常に長く実行される操作の間に定期的にメッセージを送信する必要があります。

エラーの原因となったコード


記事中にエラーが表示される。 Visual Studio 2010によるデータURL生成ツールC#の作成
のコード内で
コードのキーライン

textBox1.Text = " + ext + ";base64," + Convert.ToBase64String(ms.GetBuffer())  
                + "\" width=\"" + img.Width +"\" height=\"" + img.Height +"\" />";  

主な原因
Convert.ToBase64String(ms.GetBuffer()) は長すぎる文字列を返します。

半音階のメソッド


デバッグ" 例外

ContextSwitchDeadlockを探し、チェックを外して、OK。

なぜ、ハーフトーンなのか?
なぜなら、問題を全く解決していないのではなく、その例外を発生させなくなっただけだからです。
この問題は間違いなくプログラム自体に問題があるので、トレースとデバッグを行い、問題の根本原因を突き止め修正する必要があります。

MSDN


コンテクストスイッチデッドロックMDA
回避策 STAメッセージの送信に関するCOMの規則に従ってください。
これは一般的なことなので、どうすればいいのかわかりません。

スタックオーバーフロー


NET - ContextSwitchDeadlock が検出されました。
素晴らしい回答がここにあります
これではユーザーのデスクトップにデッドウィンドウが残ってしまい、ユーザーエクスペリエンスが良くありません。また、他のプログラムがトップレベル・ウィンドウにメッセージを送ると、応答しなくなるという副作用もあります。

この問題を本当に解決するには、スレッドを使用する必要があります。MSDNライブラリや他の多くの場所で文書化されているBackgroundWorkerを見てみてください。

これで理解できましたね。 なぜ半音階方式なのか?