2011-12-07 16 views
6

このアプリケーションが何らかの理由でアプリケーションを実行したときこの例外が発生しました。例外とどのように私はこの例外を処理することができますコンテキスト切り替えデッドロック

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

+8

すべての単語が大文字になっているテキストを読み上げるのが煩わしい –

+0

何が起こったのかの説明がそこにありますが、どのようにトリガーしたのかははっきりしない場合があります。助けを得るためには、アプリケーションが何を行い、どのように構築されているかを、より具体的にする必要があります。 –

+0

私は一般的なアルゴリズムで数独に取り組んでいます。多分、答えを見つけて、この例外が発生しました。 –

答えて

8

これは通常、ユーザーインターフェイススレッドをブロックしてCOMコンポーネントを使用している場合に発生します。

ここでの最善のアプローチは、長時間実行している操作をバックグラウンドスレッドに移行することです。これによりUIが応答的になり、COMメッセージが正しくポンピングできることも意味します。 BackgroundWorkerはこのための素晴らしいツールです。

0

私の経験上、この結果は、Windowsフォームのメインスレッドで長時間実行されるタスクが原因です。代わりにBackgroundWorkerを使用してタスクを実行することを検討してください。これを行うことのすぐれたメリットは、タスクの実行中にUIがフリーズしないように見えることです。 ProgressChangedイベントを使用して進行状況バーを実装することも考えられます。

関連する問題