A veces uso (en carga)
this.BeginInvoke((MethodInvoker) delegate {
// some code
});
o
this.BeginInvoke((MethodInvoker) this.SomeMethod);
(cambie "this" a su variable de formulario si está manejando el evento en una instancia que no sea "this").
Esto empuja la invocación al bucle de formularios de Windows, por lo que se procesa cuando el formulario está procesando la cola de mensajes.
[actualizado a pedido]
Los métodos Control.Invoke / Control.BeginInvoke están diseñados para usarse con subprocesos y son un mecanismo para impulsar el trabajo en el subproceso de la interfaz de usuario. Normalmente esto es utilizado por subprocesos de trabajo, etc. Control.Invoke hace una llamada síncrona, mientras que Control.BeginInvoke hace una llamada asíncrona.
Normalmente, estos se usarían como:
SomeCodeOrEventHandlerOnAWorkerThread()
{
// this code running on a worker thread...
string newText = ExpensiveMethod(); // perhaps a DB/web call
// now ask the UI thread to update itself
this.Invoke((MethodInvoker) delegate {
// this code runs on the UI thread!
this.Text = newText;
});
}
Lo hace al insertar un mensaje en la cola de mensajes de Windows; el subproceso de la interfaz de usuario (en algún momento) quita la cola del mensaje, procesa al delegado y le indica al trabajador que se completó ... hasta ahora todo bien ;-p
OKAY; Entonces, ¿qué sucede si usamos Control.Invoke / Control.BeginInvoke en el hilo de la interfaz de usuario? Hace frente ... si llama a Control. Invocar, es lo suficientemente sensible como para saber que el bloqueo en la cola de mensajes provocaría un punto muerto inmediato, por lo que si ya está en el hilo de la interfaz de usuario, simplemente ejecuta el código de inmediato ... para que no nos ayuda ...
Pero Control.BeginInvoke funciona de manera diferente: siempre empuja el trabajo a la cola, incluso si ya estamos en el hilo de la interfaz de usuario. Esto es una forma realmente simple de decir "en un momento", pero sin los inconvenientes de los temporizadores, etc. (¡que de todos modos tendrían que hacer lo mismo!).