Pourquoi un RaceOnRCWCleanup erreur lors de la fermeture d'un formulaire avec un contrôle WebBrowser?
VS2008, .NET 2, VB.NET, XP ...
J'ai un formulaire Windows, avec un contrôle WebBrowser et un bouton de fermeture, qui n'a tout simplement un Me.Close
. La forme du bouton annuler est réglé sur le bouton Fermer, de sorte que je peux frapper la touche ESC pour fermer le formulaire.
J'ai mis le DocumentText
propriété du contrôle WebBrowser dans l'événement load, et le code HTML s'affiche.
L'exécution de l'application à partir de Visual Studio, si je clique sur le bouton Fermer, le formulaire se ferme sans message d'erreur.
Si j'ai touché le bouton ESC-je obtenir
RaceOnRCWCleanup a été détecté
Message: Une tentative a été faite pour
gratuit un RCW qui est en cours d'utilisation. Le BRF
est en cours d'utilisation sur le thread actif ou
un autre thread. Essayez de libérer un
l'utilisation du BRF peut provoquer une corruption ou
la perte de données.
Si je lance l'application en dehors de VS, je n'ai pas d'erreur.
Des idées a) pourquoi l'erreur, et b) la façon de prévenir ou de la supprimer?
Merci beaucoup à l'avance.
Vous devez vous connecter pour publier un commentaire.
Il n'est pas une erreur, c'est un avertissement. Produit par un Assistant Débogage Managé (MDA), une extension pour le débogueur de code managé, qui pense qu'il est de voir quelque chose va mal dans votre code. La chaussure s'adapte. Vous êtes à l'aide d'un BRF, le Navigateur internet est un contrôle COM. Vous êtes à la mise à mort de la BRF, vous fermez votre formulaire. La MDA étapes, car il pense qu'il est de voir le web de navigateur que vous utilisez et se faire tuer avant que la demande est terminée. Qui serait normalement n'a de sens que si vous utilisez un fil dans votre code.
Êtes-vous? Si non, ne pas perdre le sommeil sur lui. COM utilise le comptage de référence, connu pour ne pas être en mesure de résoudre les références circulaires.
Ok, j'ai une repro pour cela, activée par les commentaires. Oui, c'est déclenchée par la forme du CancelButton propriété ou le bouton de la propriété DialogResult. Cela se produit lorsque la banque mondiale a le focus, il voit sur la touche echap appuyez sur. Partie de l'ActiveX de plomberie est à dire le récipient à ce sujet, afin de pouvoir répondre à des frappes de touches qui devrait avoir un effet secondaire. Les frappes de touches de raccourci, Onglet, Entrez. Et D'Évasion. Si le bouton, puis ferme le formulaire, le débogueur voit le WB arriver éliminés alors qu'il y a de la pile d'images à partir de la PONDÉRATION des code sur la pile. Le danger est que cela peut provoquer un crash lorsque l'appelé code renvoie depuis le composant COM est sorti, il n'est pas rare.
Voir ce crash est assez improbable, mais je peux imaginer que cela pourrait bombe lorsque le finaliseur thread s'exécute juste avant l'événement Click du bouton de retour. La solution de contournement pour le MDA et le potentiel de collision est de retarder la fermeture de la fenêtre jusqu'à ce que après l'ActiveX code s'arrête en cours d'exécution. Élégamment fait avec Contrôle.BeginInvoke(). Comme ceci: