veces uso (en carga)
this.BeginInvoke((MethodInvoker) delegate {
// some code
});
o
this.BeginInvoke((MethodInvoker) this.SomeMethod);
(cambio de "esto" a la variable de formulario si usted está manejando el caso en una instancia que no sea "este") .
Esto activa la invocación en el bucle de Windows forms, por lo que se procesa cuando el formulario procesa la cola de mensajes.
[Actualizado a petición]
Los métodos Control.Invoke/Control.BeginInvoke están destinados para su uso con roscado, y son un mecanismo para empujar el trabajo sobre la rosca UI. Normalmente esto lo utilizan los hilos de trabajo, etc. Control.Invoke realiza una llamada síncrona, mientras que Control.BeginInvoke realiza una llamada asíncrona.
Normalmente, éstos se utilizaría 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;
});
}
Para ello, empujando un mensaje en la cola de mensajes ventanas; el subproceso de interfaz de usuario (en algún punto) elimina la cola del mensaje, procesa al delegado y le indica al trabajador que lo completó ... hasta ahora todo bien ;-p
Aceptar; Entonces, ¿qué ocurre si utilizamos Control.Invoke/Control.BeginInvoke en el hilo de la interfaz de usuario? Resuelve ... si llama a Control.Invoke, 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 inmediatamente ... 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 hace una forma muy simple de decir "en un momento", pero sin la inconveniencia de los temporizadores, etc. (¡lo que igual tendría que hacer lo mismo de todos modos!).
Para mí, parece que el controlador mostrado se ejecuta MIENTRAS el formulario se está cargando ... ¿estoy equivocado? – ckonig
Viejo pero dorado ... Sí, estás equivocado. GUI no puede ejecutar tareas paralelas, lo que es importante hacer algo MIENTRAS se hace otra ejecución. –
Si en el controlador de eventos Load hay un código que llama a Application.DoEvents(), el evento Shown se desencadena antes de que los controladores de eventos de Load finalicen su ejecución. Esto se debe a que el evento Mostrado se coloca en una cola de mensajes usando Form.BeginInvoke (ShownEvent) y DoEvents() lo fuerza a disparar antes de que termine Load. – Artemix