1

数日前、作成している ac# winform アプリケーションでエラーが発生し始めました。

CLR は、60 秒間、COM コンテキスト 0x278f58 から COM コンテキスト 0x2790c8 に移行できませんでした。宛先コンテキスト/アパートメントを所有するスレッドは、非ポンピング待機を行っているか、Windows メッセージをポンピングせずに非常に長時間実行されている操作を処理している可能性があります。

これは、別のスレッドを使用して exe プロセスを実行し、UI のフリーズを回避しているときに発生します。リリース バージョンでは、このプログラムは正常に動作し、期待どおりに動作しますが、プログラムを一貫してデバッグすることはほぼ不可能です (正常に動作する場合もあれば、あまり正常に動作しない場合もあります)。

このエラーの問題を解決する複数のグーグル回答を使用して同期を強制することにより、このプロセスを実装しようとしましBackgroundWorkerたが、プログラムが予期しない方法で動作します(exeが終了する前にテキストボックスが入力され、誤ったデータが生成されます)。

このエラーは本番環境でのみ発生し、リリースでは発生しないことを読みました..だから私の質問は、この煩わしさと一緒に暮らすべきですか、それともバックグラウンドワーカー以外のソリューションですか? コード例が必要な場合は提供できますが、必要ではないと思います

4

1 に答える 1

1

Managed Debugging Assistant(MDA)は、シングルスレッドアパートメント(STA)のCOMスレッドが60秒以内にメッセージに応答しなかったことを通知しています。STA COMは、メッセージパッシングを介して実行されます。この例外は、MDAがオンになっている場合に発生します。これは、デバッガーで実行している場合のデフォルトです。MDAは、事前定義されたタイムアウトでデッドロックを検出するように機能します。これは、VSデバッガーでプログラムを実行している場合にのみ有効です。

多くのCOMコンポーネントはSTAであり、WindowsフォームのメインスレッドもSTAであるため、これはブロックしていることを示す警告です。これは、コードのステップ実行に時間を費やしてメッセージループを停止しているために発生している可能性があります。

単一のプロジェクトでこれをオフにするには、次のコンテンツをアプリケーション構成ファイルに追加します。

<mdaConfig> 
  <assistants> 
    <contextSwitchDeadlock enable="false" /> 
  </assistants> 
</mdaConfig>

これをグローバルにオフにするには:

  • VisualStudioの[デバッグ]メニューをクリックします。
  • [例外]オプションを選択します([デバッグ]-> [例外] )。
  • 例外ウィンドウが開きます。
  • ManagedDebuggingAssistants」ノードを展開します。
  • [スロー]列の下にある[ ContextSwitchDeadlock ]オプションのチェックを外します。
  • [OK]をクリックして、[例外]ウィンドウを閉じます。

このMDAを無効にすると、アプリケーションをリリースする前にバグを発見するための便利なツールが失われます。もちろん、デバッガーで実行されていないときにこのデッドロックが発生した場合は、通常のデッドロック分析を行う必要があります。

于 2013-01-22T12:37:51.863 に答える