26

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

WebBrowserコントロールと[閉じる]ボタンを備えたWindowsフォームがあります。これはMe.Close。フォームのキャンセルボタンが[閉じる]ボタンに設定されているため、ESCを押してフォームを閉じることができます。

loadイベントでWebBrowserコントロールのプロパティを設定するDocumentTextと、HTMLが表示されます。

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

ESCボタンを押すと

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

VSの外部でアプリを実行しても、エラーは発生しません。

a)エラーの理由、およびb)エラーを防止または抑制する方法についてのアイデアはありますか?

よろしくお願いします。

4

1 に答える 1

40

エラーではなく、警告です。マネージコードのデバッガーの拡張機能であるマネージデバッグアシスタント(MDA)によって生成され、コードに問題が発生していると見なします。靴がフィットします。RCWを使用している場合、WebBrowserは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(); });
    }
于 2009-12-10T02:24:53.160 に答える