Usando C # MethodInvoker.Invoke () para una aplicación GUI … ¿es esto bueno?

Utilizando C # 2.0 y el delegado de MethodInvoker, tengo una aplicación GUI que recibe algún evento del subproceso GUI o de un subproceso de trabajo.

Uso el siguiente patrón para manejar el evento en la forma:

private void SomeEventHandler(object sender, EventArgs e) { MethodInvoker method = delegate { uiSomeTextBox.Text = "some text"; }; if (InvokeRequired) BeginInvoke(method); else method.Invoke(); } 

Al usar este patrón, no duplico el código de UI real, pero de lo que no estoy seguro es si este método es bueno.

En particular, la línea

 method.Invoke() 

¿usa otro hilo para invocar o se traduce algo a una llamada directa al método en el hilo de la GUI?

La llamada method.Invoke() ejecuta el delegado en el hilo de ejecución actual. El uso de BeginInvoke(method) garantiza que se llame al delegado en el hilo de la GUI.

Esta es la forma correcta de evitar la duplicación de código cuando se puede llamar al mismo método tanto desde el hilo de la GUI como desde otros subprocesos.

Personalmente me gusta este método:

 private void ExecuteSecure(Action a) { if (InvokeRequired) BeginInvoke(a); else a(); } 

Y luego puedes escribir frases ingeniosas como esta:

 ExecuteSecure(() => this.Enabled = true); 

Tenga en cuenta que Control.InvokeRequired devuelve falso si está en el hilo de fondo Y Control.IsHandleCreated es falso. Protegería el código con una depuración. Afirme que comprueba la creación de manejadores no gestionados.

Para WinForms, al llamar Control.Invoke(Delegate) envía un mensaje a la bomba de mensajes de theUI’s thead. El hilo luego procesa el mensaje y llama al delegado. Una vez que se ha procesado, Invoke deja de bloquear y el hilo de llamada reanuda la ejecución del código.

Hace la llamada en el mismo hilo. Puede verificarlo al recorrer el código. No hay nada malo con ese enfoque.