Aplicación de formularios de Windows C # – ¿Actualizando GUI desde otro hilo Y clase?

He buscado mucho, pero parece que no encuentro nada relacionado con mi problema específico.

Quiero poder actualizar mi formulario MainUI de otra clase (SocketListener) y dentro de eso tengo un hilo que maneja la red (clientThread). Ahora mismo puedo ejecutar salidas simples desde el hilo de la red, como escribir en la salida del depurador y crear un MessageBox.

Pero lo que realmente quiero hacer es poder invocar el código del clientThread que hará las cosas en mi instancia de MainUI. ¿Cómo puedo hacer esto?

Además, si alguien quiere partes específicas del código, entonces puedo publicarlo para ayudarlo a comprender mejor lo que estoy preguntando.

¡Atentamente!

Verifique la InvokeRequired de la clase Control , y si es verdadera, llame a Invoke y pase un delegado (generalmente un método anónimo) que haga lo que quiera hacer en el hilo del cliente.

Ejemplo:

 public void DoWork(Form form) { if (form.InvokeRequired) { // We're on a thread other than the GUI thread form.Invoke(new MethodInvoker(() => DoWork(form))); return; } // Do what you need to do to the form here form.Text = "Foo"; } 

Sí, podría agregar un constructor a su clase que tome la forma de MainUI como parámetro. Esa es la manera rápida de hacerlo, pero introduce una dependencia “hacia atrás” de su clase a la MainUI donde, en teoría, no se requiere ninguna dependencia.

Como alternativa, sugeriría agregar un evento público a su clase al que el formulario de MainUI podría suscribirse. Cuando su clase necesita actualizar la MainUI (o los controles dentro de la MainUI), la clase simplemente “levantará” el evento. Esto llamará al método de MainUI que registró en el momento de la suscripción. Como ya es un método del formulario MainUI, todo lo que tiene que hacer es actualizar los controles apropiados en el formulario, asegurándose de tener en cuenta la propiedad InvokeRequired de cada control.

Y al hacer eso, aquí está la construcción que he estado usando en todo mi código.

 class NetworkEventArgs : EventArgs { /* defined class here */ } private void NetworkEventHandler(object sender, NetworkEventArgs e) { Invoke( ( MethodInvoker ) delegate { myTextBox.Text = e.Message; } } 

He basado esto en la entrada del blog aquí . No me ha fallado este enfoque, así que no veo ninguna razón para complicar mi código con una comprobación recursiva de la propiedad InvokeRequired .

puedes definir un evento tu clase clientThread

y manejarlo en mainform cuando clientThread necesita una forma principal conciente para hacer algo (como actualizar algún estado de control) debes disparar el evento

Entonces la forma principal obtiene el parámetro del evento e invoca la función de actualización