thread form c# wpf winforms invokerequired

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í:

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).