RaceOnRCWCleanupエラーがそれにWebBrowserコントロールをフォームを閉じるときに、なぜ?
-
18-09-2019 - |
質問
VS2008、.NET 2、VB.NET、XP ...
私はちょうどMe.Close
を行い、WebBrowserコントロールと閉じるボタン、で、Windowsフォームを持っています。私は、フォームを閉じるためにESCを打つことができるように、フォームのキャンセルボタンは、[閉じる]ボタンに設定されています。
私はloadイベントにWebBrowserコントロールのDocumentText
プロパティを設定し、HTMLを表示します。
私は[閉じる]ボタンをクリックすると、フォームがエラーなしで閉じ、Visual Studioのからアプリケーションを実行します。
私は私が手ESCボタンを押した場合は、
私はVS外部のアプリケーションを実行する場合は、RaceOnRCWCleanupが検出されました メッセージ:試みがためになされたもので、 使用中のRCWを解放します。 RCW アクティブなスレッドで使用されていますか 別のスレッド。解放しようとすると、 使用中のRCWが破損する可能性がありますか データ損失ます。
、私はエラーを取得していない。
任意のアイデアa)は、なぜエラー、およびb)それを防止または抑制するためにどのように?
事前に感謝します。
解決
それは警告であり、エラーではありません。それはあなたのコードで間違って何かを見ていると思っマネージドデバッグアシスタント(MDA)、マネージコードのためのデバッガの拡張機能、プロデュース。靴がフィットします。あなたは、RCWを使用して、Webブラウザーは、COMコントロールですされています。あなたは、あなたのフォームを閉じている、RCWをオフに殺害されています。それは、使用中のWebブラウザを見ていると、要求が完了する前に、それは殺さ思うので、MDAはで繰り返します。あなたのコード内のスレッドを使用している場合、それは通常、唯一の理にかなってます。
あなたはありますか?ない場合は、その上に任意の睡眠を失うことはありません。 COMは、循環参照を解決することができないために悪名高い、参照カウントを使用します。
<時間>さて、私はコメントでは有効になって、このためREPROを得ました。はい、これはフォームのCancelButtonプロパティまたはボタンのDialogResultプロパティによってトリガーされます。これは、WBにフォーカスがあるとき、それはEscキープレスを見て起こります。 ActiveXの配管の一部は、それが副作用を持つべきキーストロークに対応できるように、それについてのコンテナに伝えることです。ショートカットキーストロークは、タブは、入力します。そして脱出。ボタンは、フォームを閉じた場合、デバッガは、スタック上のRCWコードからアクティブなスタックフレームがある一方でWBが配置されたばかり見ています。危険なのは、これがCOMコンポーネントがリリースされてしまっているので、それは珍しいことではありませんときに呼び出さコードが戻るクラッシュを引き起こす可能性があるということです。
このクラッシュを見ることはかなり可能性は低いですが、私は、ファイナライザスレッドがちょうどボタンのClickイベントが戻る前に実行したときに、これは爆撃ができることを想像することができます。 MDAやクラッシュの可能性を回避するには、ActiveXのコードが実行を停止した後まで、フォームを閉じる遅延させることです。エレガント)(Control.BeginInvokeで行います。このように:
private void CancelButton_Click(object sender, EventArgs e) {
this.BeginInvoke((MethodInvoker)delegate { this.Close(); });
}