2008-09-17 12 views
15

Los eventos son síncronos en C#. Tengo esta aplicación donde mi formulario principal comienza un hilo con un bucle que escucha una transmisión. Cuando algo aparece en la transmisión, se dispara un evento desde el bucle hasta la forma principal.La mejor forma de hacer eventos asincrónicos en C#

Si el formulario principal es lento o muestra un cuadro de mensaje o algo, el ciclo se suspenderá. ¿Cuál es la mejor manera de evitar esto? ¿Al usar una devolución de llamada e invocar en el formulario principal?

Respuesta

3

Hmmm, he usado diferentes escenarios que dependían de lo que necesitaba en ese momento.

Creo que el BeginInvoke probablemente sea el código más fácil ya que casi estás allí. De cualquier manera, ya deberías usar Invoke, así que simplemente cambia a BeginInvoke. El uso de una devolución de llamada en un subproceso independiente logrará lo mismo (siempre que utilice el subproceso de subprocesos para poner en cola la devolución de llamada) como el uso de BeginInvoke.

+0

Esto encajaba mejor con mi aplicación, lanzar el lazo en un backgroundworker no encaja del todo como quiero manejar esto. –

+0

No se olvide de usar EndInvoke también, de lo contrario no se lanzarán excepciones a los métodos invocados. – dmigo

8

Dado que está utilizando un formulario, la manera más fácil es usar el componente BackgroundWorker.

La clase BackgroundWorker le a ejecutar una operación en un hilo separado, dedicado. Las operaciones como y las descargas que consumen tiempo pueden hacer que su usuario interfaz (IU) parezca haya dejado de responder mientras están ejecutando . Cuando desee una interfaz de usuario receptiva y tenga que enfrentarse a largas demoras asociadas con dichas operaciones, la clase BackgroundWorker brinda una solución conveniente .

+0

Debo estar de acuerdo, un BackgroundWorker es la manera más agradable y limpia. –

0

Tiene algunas opciones, como ya se detalla, pero en mi experiencia, es mejor dejar delegados y BeginInvoke, y usar BackgroundWorker en cambio (v2.0 +), ya que es más fácil de usar y también le permite interactuar con el formulario principal en la finalización del hilo. En general, he encontrado una solución muy bien implementada.

0

System.ComponentModel.BackgroundWorker es realmente un buen punto de partida. Hará su trabajo asincrónico, le dará notificaciones de eventos importantes y tendrá formas de integrarse mejor con sus formularios.

Por ejemplo, puede activar las notificaciones de progreso registrando un controlador para el evento ProgressChanged. (lo cual es muy recomendable si tiene un proceso asincrónico largo y no desea que su usuario piense que la aplicación se congeló)

Cuestiones relacionadas