Estoy usando un control visual en mi proyecto que proviene de una biblioteca a la que no tengo acceso.
Lleva mucho tiempo actualizar (200ms, aproximadamente) para una buena respuesta de la IU con tres de estos controles en pantalla a la vez. (Es posible que deba actualizar los tres a la vez, lo que deja mi UI atascada durante ~ 600 ms mientras todos están pensando).Ejecutar un control WPF en otro hilo
He leído algunas publicaciones sobre TaskSchedulers, y estoy comenzando a investigar las funciones de la tarea Paralela como una forma de ejecutar cada uno de estos controles en su propio hilo. La plataforma será multinúcleo, por lo que quiero aprovechar el procesamiento simultáneo.
El problema es que ni siquiera sé lo que no sé acerca de cómo hacer esto, aunque ..
¿Existe un patrón de diseño apropiado para ejecutar un control en un hilo separado de la principal UI hilo en WPF?
Específicamente: es un control de mapa de terceros, que cuando se le da una nueva ubicación o el nivel de zoom tarda demasiado en volver a dibujar (~ 200ms). Con quizás tres de estas actualizaciones a un máximo de 4Hz, obviamente no se mantendrán al día.
He encapsulado el control WPF en un control de usuario, y necesito ejecutar cada instancia en su propio hilo, mientras sigo capturando la entrada del usuario (clics del mouse, por ejemplo).
ACTUALIZACIÓN: mientras estoy buscando una solución, he implementado lo siguiente hasta ahora.
Mi hebra principal (UI) genera un hilo que crea una nueva ventana que contiene el control en cuestión, y lo ubica en la posición correcta (para que parezca que es solo un control normal).
_leftTopThread = new Thread(() =>
{
_topLeftMap = new MapWindow()
{
WindowStartupLocation = WindowStartupLocation.Manual,
Width = leftLocation.Width,
Height = leftLocation.Height,
Left = leftLocation.X,
Top = leftLocation.Y,
CommandQueue = _leftMapCommandQueue,
};
_topLeftMap.Show();
System.Windows.Threading.Dispatcher.Run();
});
_leftTopThread.SetApartmentState(ApartmentState.STA);
_leftTopThread.IsBackground = true;
_leftTopThread.Name = "LeftTop";
_leftTopThread.Start();
Dónde CommandQueue
es una cola Thread-safe BlockingCollection para enviar comandos al mapa (que se mueve la ubicación, etc).
El problema ahora es que puedo ya sea
- tener la entrada del usuario debido a la
System.Windows.Threading.Dispatcher.Run()
llamada - o bloque en el CommandQueue, la escucha de los comandos enviados por el hilo principal
I no puedo girar esperando órdenes, ¡porque absorbería todo mi hilo CPU!
¿Es posible bloquear y tener activada la bomba de mensajes del evento?
controles WPF Todos deben actualizarse en el hilo de interfaz de usuario. Sin embargo, podríamos ayudarlo si proporciona algunos detalles del control que está utilizando y cualquier código que haya escrito para actualizarlo/poblarlo. –
@CameronPeters, ¿está seguro de que no puede haber más de un "hilo de interfaz de usuario"? – svick
Actualmente tengo varios subprocesos 'UI' en ejecución en este momento (gracias a Threading.Dispatcher.Run()), pero no puedo bloquearlos en espera de señales. – DefenestrationDay