2011-07-19 9 views
5

Estoy desarrollando un sistema de mensajería basado en controles webBrowser para que pueda formatear el texto como mejor me plazca. . Cuando el usuario está en línea y es enviado mensajes, los mensajes se almacenan y se envía un evento por cada mensaje cuando se vuelva a conectar cuando me puse el html por defecto y tal para la página web, que normalmente uso:Alternativa a Application.DoEvents()

while (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents(); 

Esto funciona cuando el programa se ejecuta normalmente. Cuando el usuario recibe un mensaje enviado cuando están desconectados, esto activa el siguiente evento de mensaje, y así sucesivamente, con cada mensaje hasta el último. Esto significa que el último mensaje enviado cuando están desconectados es el único que se muestra. Me gustaría algo como Application.DoEvents() que permite que el control se mantenga actualizando y cargando, pero eso no desencadena otros eventos.

Gracias

EDIT:

I solucionó el problema mediante la eliminación de DoEvents() completamente. En lugar de cambiar DocumentText mientras trabajaba, configuré un generador de cadenas y luego configuré el html de una vez al final.

+2

Si está llamando a 'Application.DoEvents()', normalmente eso indica un error en su diseño. ¿Hay alguna razón por la que no puedas usar el evento 'completado'? – leppie

+0

Básicamente necesito que el navegador web termine de cargarse, pero el hilo actual se siga ejecutando. Formateo el mensaje y luego reviso el html de respaldo. Si el html es incorrecto, lo actualizo y luego agrego el mensaje. Antes de cambiar el texto del documento, me aseguro de que el navegador web esté cargado y esté completo. –

Respuesta

5

Te recomiendo que dejes de usar Application.DoEvents(), es generar problemas más de lo que resuelve. check this.

Una forma mejor es usar AutoResetEvent para notificar cada vez que se complete la carga, o planteando un evento cada vez que se realiza la carga. también puede ejecutar su espera en otro hilo para no tener que usar Application.DoEvents() ...

+0

Ese fue un excelente artículo. Realmente, me gustaría permitir que el control webBrowser termine de cargarse y luego continuar. No me importa si la interfaz de usuario se ve afectada porque el código debe ejecutarse lo suficientemente rápido como para evitar cualquier isses. Sin embargo, como funciona DoEvents(), sé que ni siquiera está cerca de la solución. Sin embargo, me gustaría evitar ir a otros eventos. Quiero permanecer dentro del método de ejecución si puedo. –

+0

Esto no solucionó mi problema, pero estoy aceptando la respuesta debido al enlace sobre DoEvents(). La información que proporcionó fue suficiente para que reescribiera el programa. –

0

Puede usar System.Threading.Thread.Join() como una alternativa a DoEvents(), ya que este método detiene la ejecución actual de subprocesos hasta que la cadena de llamada anterior complete la ejecución.

+1

Eso no permitirá que se cargue WebBrowser. Además, no hay un segundo hilo. – SLaks