RaceOnRCWCleanupエラーがそれにWebBrowserコントロールをフォームを閉じるときに、なぜ?

StackOverflow https://stackoverflow.com/questions/1874496

質問

VS2008、.NET 2、VB.NET、XP ...

私はちょうどMe.Closeを行い、WebBrowserコントロールと閉じるボタン、で、Windowsフォームを持っています。私は、フォームを閉じるためにESCを打つことができるように、フォームのキャンセルボタンは、[閉じる]ボタンに設定されています。

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

私は[閉じる]ボタンをクリックすると、フォームがエラーなしで閉じ、Visual Studioのからアプリケーションを実行します。

私は私が手ESCボタンを押した場合は、

  

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

私はVS外部のアプリケーションを実行する場合は、

、私はエラーを取得していない。

任意のアイデア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(); });
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top