Pregunta

Los eventos son sincrónicos en C#.Tengo esta aplicación en mi formulario principal se inicia un hilo con un bucle en el que se escucha a un arroyo.Cuando algo viene a lo largo de la secuencia de un evento es disparado desde el bucle para el formulario principal.

Si el formulario principal es lento o se muestra un cuadro de mensaje o algo por el bucle será suspendido.¿Cuál es la mejor forma de evitar esto?Mediante el uso de una devolución de llamada y de invocar en el formulario principal?

¿Fue útil?

Solución

Hmmm, yo he utilizado distintos escenarios en los que dependía de lo que yo necesitaba en el momento.

Creo que el BeginInvoke probablemente sería el más fácil de código ya que usted está casi allí.De cualquier manera usted debe utilizar Invocar ya, tan solo cambiando a BeginInvoke.El uso de una devolución de llamada en un subproceso independiente que llevara a cabo la misma cosa (siempre y cuando usted utilice el threadpool a la cola de la devolución de llamada) como el uso de BeginInvoke.

Otros consejos

Ya que usted está utilizando una forma, la forma más fácil es usar el BackgroundWorker componente.

La clase BackgroundWorker permite para ejecutar una operación en una independiente, dedicado hilo.Consume mucho tiempo las operaciones de descarga y de la base de datos las transacciones pueden causar que su usuario interface (interfaz de usuario) para que parezca como si se ha dejado de responder mientras se ejecutando.Cuando se desea una respuesta de interfaz de usuario y se enfrentan con largas demoras asociadas a estas operaciones, el Clase BackgroundWorker proporciona un solución conveniente.

Los eventos son sólo los delegados, a fin de utilizar BeginInvoke.(ver Hacer Llamadas de Método Asincrónico en el .Ambiente de RED)

Usted tiene algunas opciones, como ya se ha detallado, pero en mi experiencia, es mejor dejar a los delegados y a BeginInvoke, y el uso de BackgroundWorker lugar (v2.0+), ya que es más fácil de usar y también le permite interactuar con el formulario principal en el hilo de la finalización.Todo en todos un muy weel solución implementada, que he encontrado.

Sistema.ComponentModel.BackgroundWorker de hecho es un buen punto de partida.Que va a hacer su trabajo asincrónico, darle las notificaciones de eventos importantes, y tiene formas de integrar mejor con sus formas.

Por ejemplo, puede activar el progreso de las notificaciones mediante el registro de un controlador para el evento de ProgressChanged.(que es muy recomendable si usted tiene un largo proceso asincrónico y no quieres que tu usuario a pensar que la aplicación no responde)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top