tutorial - La mejor forma de hacer eventos asincrónicos en C#
static async task c# (5)
Los eventos son sincrónicos 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.
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?
Como está utilizando un formulario, la forma más sencilla es usar el componente BackgroundWorker .
La clase BackgroundWorker le permite ejecutar una operación en un subproceso dedicado y separado. Las operaciones que consumen mucho tiempo, como las descargas y las transacciones de bases de datos, pueden hacer que su interfaz de usuario (UI) parezca que ha dejado de responder mientras se están ejecutando. Cuando desea una interfaz de usuario receptiva y se enfrenta a largas demoras asociadas con tales operaciones, la clase BackgroundWorker proporciona una solución conveniente.
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. Utilizar 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.
Los eventos son solo delegados , así que use BeginInvoke. (ver Hacer llamadas a métodos asíncronos en el entorno .NET )
Tiene algunas opciones, como ya se detalla, pero en mi experiencia, es mejor que deje delegados y BeginInvoke, y use BackgroundWorker en su lugar (v2.0 +), ya que es más fácil de usar y también le permite interactuar con el forma principal en la terminación del hilo. En general, he encontrado una solución muy bien implementada.
System.ComponentModel.BackgroundWorker es de hecho 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. (que es muy recomendable si tiene un proceso asincrónico largo y no desea que su usuario piense que la aplicación se congeló)