2011-02-01 14 views
12

Visual Studioを使用してアプリケーションを実行すると、DisconnectedContext(マネージデバッグアシスタント)が表示されます。 Googleとドキュメントがあれば、これはSTAのCOMオブジェクトが他のスレッドから呼び出されたときに発生します。Visual StudioでDisconnectedContextを解決する

しかし、ポップアップが表示されたときにすべてのスレッドを見ると、このようなものは見つかりません。 (そして、私は全く変わったものを見つけられません)。

DisconnectedContextの発生方法を知る方法についてのアイデアはありますか?

答えて

2

これはかなり重大な警告です。無視しないでください。このシナリオでは、スレッド上にCOMオブジェクトを作成し、そのスレッドを終了したということです。しかし、あなたはそのオブジェクトを使い続けます。 COMはスレッドセーフではないことを発表したオブジェクト(別名アパートメントスレッド)を処理し、そのオブジェクトの呼び出しを自動的に作成したスレッドにマーシャリングします。そのスレッドがもはや周囲にないときにはうまくいかない。

警告を無視すると、スレッド競合エラーのトラブルシューティングを行うことがあります。一週間に一度だけ微妙に間違っているもの。コードを確認し、作成されたオブジェクトがどのように不満を持っているかに注意してください。

+2

私は警告を無視してはいけません(CTRL + ALT + Eで削除するとそのトリックを行います)。問題は、アプリケーションが巨大で、警告がなぜそれが誘発されているのかを教えてくれないので、どこを見るか分からないということです。 – Toto

+0

さて、私はなぜそれが引き起こされているのか、原因を探すべき理由を説明しようとしました。鯨の音で鯨を倒すあなたがそれを並べ替えることができない場合、このプロジェクトで働いていた人々の助けを得ることを試みてください。 –

9
このエラーは、CLRを使用して、任意のマルチスレッドアプリで事実上避けられない過渡スレッドで(インプロセス相互運用機能を通じてオブジェクト

同じ答えを探して、この中には、私がコメントを追加しようと思いましたが見つかり

... )。問題は、CLRがオブジェクトの非決定論的なクリーンアップ(基底のCOMオブジェクトにスレッドアフィニティを持つRCWである可能性があります)があったことです。スレッドで作成されたオブジェクトをクリーンアップするようにランタイムに指示する方法はありません(少なくともスレッドで別の非決定的なクリーンアップハンドルを作成することはありません)。これは相互運用メカニズムの設計上の制限です。そのため、このエラーが発生することなく、CLRオブジェクトを作成したスレッドを安全に終了する方法はありません。

ベストアドバイス:CLR /相互運用機能を使用することはお勧めしません。次善のアドバイス:COM +を使用してinteropをプロセス分離します。これにより、CLRはスレッドを終了させないプロセス(永続スレッドプールまたは同等のものを使用します)で実行できます。次のベストアドバイス:Microsoftに引き続き、この相互運用性に関するこの設計レベルの問題についてMicrosoftに伝えてください。

関連する問題