¿Quiere decir Delegate.Invoke/BeginInvoke o Control.Invoke/BeginInvoke?
- Delegate.Invoke: se ejecuta de forma síncrona, en el mismo hilo.
- Delegate.BeginInvoke: se ejecuta de forma asincrónica, en una secuencia de subprocesos.
- Control.Invocar: se ejecuta en el subproceso de la interfaz de usuario, pero el subproceso de llamada espera su finalización antes de continuar.
- Control.BeginInvoke: se ejecuta en el subproceso de la interfaz de usuario, y el subproceso de llamada no espera a completarse.
La respuesta de Tim menciona cuándo es posible que desee utilizar BeginInvoke, aunque estaba orientado principalmente a Delegate.BeginInvoke, sospecho.
Para las aplicaciones de Windows Forms, sugiero que debe generalmente use BeginInvoke. De esta forma, no tiene que preocuparse por el punto muerto, por ejemplo, pero debe entender que es posible que la interfaz de usuario no se haya actualizado en el momento en que vuelva a examinarlo. En particular, no debe modificar los datos que la secuencia de la interfaz de usuario podría utilizar para fines de visualización. Por ejemplo, si usted tiene una persona con propiedades nombre y apellidos, y se hizo:
person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";
continuación, la interfaz de usuario puede bien terminar mostrando "Keyser Spacey". (Existe la posibilidad remota de que muestre "Kevin Soze" pero solo a través de la rareza del modelo de memoria).
Sin embargo, a menos que tenga este tipo de problema, Control.BeginInvoke es más fácil de hacer, y evitará hilo de fondo de tener que esperar sin una buena razón. Tenga en cuenta que el equipo de Windows Forms ha garantizado que puede usar Control.BeginInvoke de una manera "disparar y olvidarse", es decir, sin llamar siempre a EndInvoke. Esto no ocurre con las llamadas asincrónicas en general: normalmente, cada BeginXXX debe tener una llamada EndXXX correspondiente, generalmente en la devolución de llamada.
Entonces, ¿por qué las personas usar Invocar sobre BeingInvoke? ¿No debería haber algunas ventajas sobre el uso de Invoke? Ambos ejecutan procesos en segundo plano, ¿solo uno está en el mismo hilo, el otro en hilo diferente? – yeeen
@Jon: Mientras estoy usando Dispatcher.BeginInvoke, mi código funciona bien y en Dispatcher. Invoco mi aplicación, lo que me hace esperar unos segundos, luego inicializa todos los controles y luego se inicia. ¿Puede ayudarme a averiguar exactamente en qué lugar? atascado ? – SharpUrBrain
@Todo: ¿Alguien puede dar una breve idea sobre Dispatcher.BeginInvoke y Dispatcher.Invoke? Cómo funcionan y qué hacen, todo. – SharpUrBrain