Estoy familiarizado con el multi-threading porque lo leí pero nunca lo he usado en la práctica.C# Multithreading - Invoque sin control
Tengo un proyecto que utiliza una biblioteca de terceros que comparte el estado de un dispositivo de entrada mediante la generación de eventos. El problema es que, por la forma en que se escribe la biblioteca, estos eventos surgen de un hilo diferente.
Mi aplicación no necesita ser de subprocesos múltiples y he tenido muchos problemas clásicos de subprocesamiento (los controles de la UI se quejan de que se interactúa con un hilo diferente, las colecciones que se modifican cuando una parte del código se itera sobre ella, etc.).
Solo quiero que el evento de la biblioteca de terceros se devuelva a mi hilo de interfaz de usuario. Específicamente, lo que creo que debería suceder es:
Mi clase recibe el evento y el controlador se está ejecutando en un hilo diferente al de la IU. Quiero detectar esta condición (como con InvokeRequired), y luego realizar el equivalente de BeginInvoke para devolver el control al subproceso de UI. A continuación, las notificaciones adecuadas se pueden enviar en la jerarquía de clases y todos mis datos solo se ven afectados por el único hilo.
El problema es que la clase que recibe estos eventos de entrada no se deriva de Control y, por lo tanto, no tiene InvokeRequired o BeginInvoke. La razón de esto es que traté de separar limpiamente la IU y la lógica subyacente. La clase todavía se está ejecutando en el hilo de la interfaz de usuario, simplemente no tiene ninguna interfaz de usuario dentro de la clase.
Ahora mismo solucioné el problema arruinando esa separación. Paso en una referencia al control que mostrará datos de mi clase y usando es Invocar métodos. Parece que eso frustra el propósito de separarlos porque ahora la clase subyacente depende directamente de mi clase específica de UI.
Quizás haya una manera de guardar una referencia al hilo que ejecutó el constructor y luego hay algo en el espacio de nombres de Threading que ejecutará los comandos Invoke?
¿Hay alguna forma de evitar esto? ¿Mi enfoque es completamente incorrecto?
Me llevó un tiempo entender cómo se usan los delegados, pero funciona. – colithium