¿Por qué un error RaceOnRCWCleanup al cerrar un formulario con el control WebBrowser en él?

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

Pregunta

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

Tengo un formulario de Windows, con un control WebBrowser y un botón Cerrar, que sólo hace un Me.Close. botón de cancelación del formulario se establece en el botón Cerrar, para que pueda golpear la tecla ESC para cerrar el formulario.

I establece la propiedad DocumentText del control WebBrowser en el evento de carga, y las pantallas HTML.

Al ejecutar la aplicación desde Visual Studio, si hago clic en el botón Cerrar, se cierra el formulario sin error.

Si pulso el botón ESC consigo

  

se detectó RaceOnRCWCleanup   Mensaje: Un intento se ha hecho para   liberar a un RCW que está en uso. el RCW   está en uso en el hilo activo o   otro hilo. El intento de liberar a un   en uso RCW puede causar daños o   la pérdida de datos.

Si me quedo fuera de la aplicación de VS, me sale ningún error.

Todas las ideas a) por qué el error, y b) cómo prevenir o suprimirlo?

Muchas gracias de antemano.

¿Fue útil?

Solución

No es un error, es una advertencia. Producido por un asistente Gestionado Depuración (MDA), una extensión del depurador de código administrado, que piensa que está viendo algo va mal en el código. El zapato encaja. Está utilizando un RCW, WebBrowser es un control COM. Que está acabando con la RCW, que está cerrando su formulario. La MDA en los pasos, ya que piensa que está viendo el navegador web en uso y perder la vida antes de completar la solicitud. Que normalmente sólo tendría sentido si está utilizando un hilo en el código.

¿Es usted? Si no es así, no pierden el sueño por esto. COM utiliza el recuento de referencias, conocidos por no ser capaz de resolver las referencias circulares.


Está bien, tengo una repro para esto, habilitado por los comentarios. Sí, esto es provocado por la propiedad CancelButton de la forma o propiedad DialogResult del botón. Esto sucede cuando el BM tiene el foco, se ve la pulsación de tecla Escape. Parte de la instalación de cañerías de ActiveX es decirle al contenedor de ella para que pueda responder a las pulsaciones de teclas que debe tener un efecto secundario. pulsaciones de tecla de acceso directo, Tab, Enter. Y Escape. Si el botón se cierra el formulario, el depurador ve el BM conseguir dispuesta mientras que hay marcos de pila activos desde el código RCW en la pila. El peligro es que esto podría causar un choque cuando los llamados código vuelve desde el componente COM fue liberada, no es raro.

Al ver esta caída es bastante improbable, pero puedo imaginar que esto podría bombardear cuando el subproceso finalizador se ejecuta justo antes del regreso de evento Click del botón. La solución para la MDA y la caída de potencial es retrasar el cierre de la forma hasta después de que el código ActiveX deja de funcionar. Elegantemente hecho con Control.BeginInvoke (). De esta manera:

    private void CancelButton_Click(object sender, EventArgs e) {
        this.BeginInvoke((MethodInvoker)delegate { this.Close(); });
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top