2009-12-09 33 views
20

VS2008、.NET 2、VB.NET、XP ...WebBrowserコントロールでフォームを閉じるときにRaceOnRCWCleanupエラーが発生するのはなぜですか?

私はWindowsフォームを持ち、Webブラウザーコントロールと閉じるボタンはMe.Closeです。フォームのキャンセルボタンは閉じるボタンに設定されているので、ESCを押してフォームを閉じることができます。

loadイベントにWebBrowserコントロールのDocumentTextプロパティを設定し、HTMLを表示します。

Visual Studioからアプリケーションを実行しているときに、閉じるボタンをクリックすると、フォームはエラーなしで閉じます。私はESCボタンを押した場合

は私が

RaceOnRCWCleanupが検出された メッセージが表示されます:試みが使用されている 自由RCWに行われています。 RCW がアクティブスレッドで使用されているか、別のスレッドで が使用されています。使用中のRCWを から解放しようとすると、データが破損するか、 が失われる可能性があります。

私はVSの外でアプリを実行するとエラーは表示されません。

アイデアa)なぜエラーですか、そしてb)それを防止するか抑止するか?

事前に感謝します。

答えて

30

これはエラーではありません。警告です。マネージドデバッグアシスタント(MDA)(マネージドコードのデバッガの拡張機能)によって生成されます。マネージドデバッグアシスタントは、コード内で何か問題が発生していると考えています。靴がフィットします。 RCWを使用していますが、WebブラウザーはCOMコントロールです。あなたはRCWを殺している、あなたはあなたのフォームを閉じている。 MDAは、Webブラウザが使用中であり、要求が完了する前に殺されていると考えているために入ります。これは通常、コード内でスレッドを使用している場合にのみ意味をなさないでしょう。

ですか?もしそうでなければ、それ以上の睡眠を失わないでください。 COMは循環参照を解決できないことで有名な参照カウントを使用します。


わかりました。これはコメントで有効になっています。はい、これは、フォームのCancelButtonプロパティまたはボタンのDialogResultプロパティによってトリガーされます。これは、WBにフォーカスがあるときに発生し、エスケープキーが押されたことを示します。 ActiveXの配管の一部は、コンテナにそのことを伝えることで、副作用が発生するはずのキーストロークに対応することができます。ショートカットキーストローク、Tab、Enterそしてエスケープ。ボタンがフォームを閉じると、スタック上のRCWコードからのアクティブなスタックフレームがある間、デバッガはWBが処理されるのを見ます。危険なのは、COMコンポーネントがリリースされてから呼び出されたコードが戻ったときにクラッシュする可能性があることです。これは珍しいことではありません。

このクラッシュを見るのはほとんどありませんが、ボタンのClickイベントが返される直前にファイナライザスレッドが実行されたときに爆発する可能性があります。 MDAと潜在的なクラッシュの回避策は、ActiveXコードの実行が停止するまでフォームを閉じるのを延期することです。エレガントにControl.BeginInvoke()で完了しました。このように:

private void CancelButton_Click(object sender, EventArgs e) { 
     this.BeginInvoke((MethodInvoker)delegate { this.Close(); }); 
    } 
+2

いいえ、それはすべてフォアグラウンドスレッドで起こっています。 それは私が気になることが起こっているという事実ではありません - VSでそれらを切る方法があります。CloseボタンをクリックしてCloseイベントハンドラを呼び出した場合、*は発生しませんが、CloseボタンはフォームのCancelボタンプロパティであるため、ESCを押して同じハンドラを呼び出すと、 *します。 なぜ違いがありますか? – ChrisA

+2

私はこの正確なシナリオを見ています。Webブラウザを使用してフォームを閉じる必要があるため、問題はありません。 ESCを押して「X」をクリックするのに違いがある理由を理解したいと思います。 – mpeterson

+0

@chris、@mpeterson - reproと解決策を得て、更新されたポスト。 –

関連する問題