Warum ein RaceOnRCWCleanup Fehler beim Schließen eines Formulars mit WebBrowser Kontrolle über sie?

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

Frage

VS2008, .NET 2, VB.NET, XP ...

Ich habe ein Windows-Formular mit einem WebBrowser-Steuerelement und ein Schließen-Taste, die nur eine Me.Close tut. Die Abbrechen des Formulars Taste auf die Schaltfläche Schließen eingestellt, so dass ich ESC drücken Sie die Form zu schließen.

Ich habe die DocumentText Eigenschaft des WebBrowser-Steuerelement in dem Ladeereignis, und die HTML-Anzeigen.

Ausführen der Anwendung von Visual Studio, wenn ich auf die Schaltfläche Schließen klicken, wird das Formular ohne Fehler.

Wenn ich drücken Sie die ESC-Taste, ich

  

RaceOnRCWCleanup nachgewiesen   Nachricht: Es wurde versucht, gemacht   kostenlos ein RCW, die in Gebrauch ist. die RCW   im Einsatz auf dem aktiven Thread ist oder   ein anderer Thread. Der Versuch, eine befreien   in-Gebrauch kann RCW verursachen Korruption oder   Datenverlust.

Wenn ich die app außerhalb VS laufen lasse, erhalte ich keinen Fehler.

Irgendwelche Ideen a) warum Sie den Fehler, und b), wie es zu verhindern oder zu unterdrücken?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Es ist kein Fehler, es wird eine Warnung. Produziert von einem Managed Debugging Assistant (MDA), eine Erweiterung des Debugger für verwalteten Code, die es denkt, etwas falsch läuft in Ihrem Code ist zu sehen. Der Schuh passt. Sie verwenden ein RCW, WebBrowser ist ein COM-Steuerelement. Sie töten die RCW aus, Sie das Formular schließen. Die MDA Schritte in, weil sie denkt, dass es den Web-Browser im Einsatz zu sehen und es zerfetzt, bevor die Anforderung abgeschlossen ist. Das wäre normalerweise nur dann sinnvoll, wenn Sie einen Thread in Ihrem Code verwenden.

Sind Sie? Wenn nicht, verliert keine drüber schlafen. COM verwendet Referenzzählung, berüchtigt für nicht zirkuläre Referenzen lösen zu können.


Okay, habe ich eine repro dafür, durch die Kommentare aktiviert. Ja, wird dies durch die CancelButton Eigenschaft des Formulars ausgelöst oder die Dialog Eigenschaft der Schaltfläche. Dies geschieht, wenn der WB den Fokus hat, ist es die Esc-Taste drücken sieht. Ein Teil der ActiveX sanitären Anlagen ist der Behälter darüber zu erzählen, so dass es auf Tastatureingaben reagieren kann, die einen Nebeneffekt haben sollten. Tastaturbefehle, Tab, Enter. Und Escape. Wenn die Taste dann die Form geschlossen wird, sieht der Debugger des WB angeordnet zu werden, während es auf dem Stapel aktiver Stack-Frames von dem RCW-Code ist. Die Gefahr besteht darin, dass dies zu einem Absturz führen könnte, wenn die angerufene Code zurückkehrt, da die COM-Komponente wurde freigegeben, es ist nicht ungewöhnlich.

Mit diesem Absturz zu sehen, ist ziemlich unwahrscheinlich, aber ich kann mir vorstellen, dass diese Bombe könnte, wenn der Finalizerthread läuft kurz vor der Click-Ereignisse kehrt der Schaltfläche. Die Abhilfe für das MDA und den möglichen Absturz ist das Formular erst nach dem ActiveX-Code zu verzögern Schließen nicht mehr läuft. (Elegant mit Control.BeginInvoke getan). Wie folgt aus:

    private void CancelButton_Click(object sender, EventArgs e) {
        this.BeginInvoke((MethodInvoker)delegate { this.Close(); });
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top