form - invokerequired c#
InvokeRequired in wpf (4)
En WPF use el método CheckAccess
lugar de InvokeRequired
if (!CheckAccess()) {
// On a different thread
Dispatcher.Invoke(() => log_left_accs(arg));
return;
}
Esta pregunta ya tiene una respuesta aquí:
- ¿Qué pasó con Control.InvokeRequired en WPF? 3 respuestas
Utilicé esta función en una aplicación de Windows forms
:
delegate void ParametrizedMethodInvoker5(int arg);
private void log_left_accs(int arg)
{
if (InvokeRequired)
{
Invoke(new ParametrizedMethodInvoker5(log_left_accs), arg);
return;
}
label2.Text = arg.ToString();
}
Pero en WPF
no funciona. ¿Por qué?
En WPF, el método Invoke
está en el despachador, por lo que debe llamar a Dispatcher.Invoke
lugar de Invoke
. Además, no hay InvokeRequired
propiedad InvokeRequired
, pero el despachador tiene un método CheckAccess
(por alguna razón, está oculto en intellisense). Entonces tu código debería ser:
delegate void ParametrizedMethodInvoker5(int arg);
void log_left_accs(int arg)
{
if (!Dispatcher.CheckAccess()) // CheckAccess returns true if you''re on the dispatcher thread
{
Dispatcher.Invoke(new ParametrizedMethodInvoker5(log_left_accs), arg);
return;
}
label2.Text= arg.ToString();
}
WPF usa el Dispatcher
para controlar el acceso a la bomba de mensajes, en lugar de que cada control sea responsable de acceder al subproceso de la interfaz de usuario.
Debe usar Dispatcher.Invoke
para agregar un delegado al subproceso de la interfaz de usuario en una aplicación WPF.
También vale la pena señalar que InvokeRequired
no es realmente necesario en una aplicación winform, ni tampoco es algo que deba verificar en una aplicación WPF. Debes saber que no estás en el hilo de la interfaz de usuario cuando llamas Invoke
. Nunca deberías estar en una situación en la que a veces se llama a un método dado desde el subproceso de la interfaz de usuario ya veces se te llama desde un subproceso de fondo. Elige uno; siempre obligue a la persona que llama a invocar el subproceso de la IU antes de llamar a un método determinado (por lo que no necesita invocar) o suponga que la persona que llama no estará en la hebra de la IU cuando se llame al método. También vale la pena señalar que llamar a Invoke
cuando ya estás en el hilo de la interfaz de usuario está bien. No hay errores o problemas que resulten de una instancia ocasional de reinvocación del subproceso de la interfaz de usuario (hay un costo de rendimiento muy pequeño, así que simplemente no agregue código innecesario para todo el lugar).
comprobar Dispatcher.CheckAccess()