Dispatcher.CurrentDispatcher.BeginInvoke No invocando
Frecuentes
Visto 17,397 veces
13
Tengo un FileSystemWatcher
y los eventos generados por esto cuando un archivo observado cambia se generan en un subproceso diferente del subproceso de la interfaz de usuario. Para evitar y cruzar la diversión de la volación del acceso a los subprocesos, estoy intentando usar
public void RaisePathChanged(object sender, RenamedEventArgs e)
{
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
{
// Some code to handle the file state change here.
}));
}
Esto compila bien y el RaisePathChanged
se dispara como debe ser. Sin embargo, el código dentro del delegado Action(() => { /*Here*/ })
nunca se llama/invoca, el código simplemente se omite.
¿Por qué se omite el código? ¿Cómo puedo solucionarlo? ¿Es esta la mejor manera de asegurar que el código se ejecute en el subproceso que lo creó en WPF?
Gracias por su tiempo.
2 Respuestas
24
Estás mezclando las cosas.
Dispatcher.CurrentDispatcher
no es lo mismo que Application.Current.Dispatcher
.
El segundo es el que pareces estar buscando.
Mira esto.
Dispatcher.CurrentDispatcher frente a Application.Current.Dispatcher
Pruébelo con el despachador de aplicaciones.
contestado el 23 de mayo de 17 a las 13:05
4
Dispatcher.CurrentDispatcher
es el despachador del subproceso "actual"; en este caso, el subproceso RaisePathChanged
se está ejecutando.
Cuando tu dices Dispatcher.CurrentDispatcher
.NET creará un nuevo despachador si no hubiera ninguno.
Sin embargo, no será Run()
dijo el despachador!
Entonces, cuando programe algo en él (con BeginInvoke
) en realidad no se ejecutará a menos que ese despachador se esté ejecutando.
Eso probablemente responde a su primera pregunta (¿Por qué no está invocando?)
Para evitar la violación de acceso entre subprocesos, necesita el despachador del subproceso que creó lo que está tratando de proteger y asegurarse de que sea un despachador en ejecución.
Si lo que sea que esté tratando de proteger se creó en el subproceso GUI predeterminado, entonces use Application.Current.Dispatcher
como dice la respuesta anterior, de lo contrario, deberá explicar un poco más y publicar un poco más de código antes de que podamos responder su segunda pregunta. http://www.diranieh.com/NET_WPF/Threading.htm tiene una introducción bastante breve sobre el tema.
Respondido 07 Oct 16, 22:10
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# wpf dispatcher or haz tu propia pregunta.