Sin un buen Minimal, Complete, and Verifiable code example para mostrar claramente lo que está haciendo, es imposible para saber con certeza cuál es la mejor respuesta aquí. Sin embargo, según su descripción, parece que el algoritmo de generación de laberinto se está ejecutando en el hilo de la interfaz de usuario, lo que impide que la interfaz de usuario se actualice.
Al igual que en el caso de Windows Forms, donde las personas son tentadoras para llamar a métodos como Refresh()
o Application.DoEvents()
, el verdadero problema aquí es que estás bloqueando el hilo de interfaz de usuario. La forma correcta para arreglar que es, no hagas eso.
Hay muchas alternativas y sin una pregunta más detallada, no hay forma de saber cuál sería el mejor enfoque en su caso. Sin embargo, las dos técnicas más utilizadas y las más apropiadas son las de BackgroundWorker
o Task.Run()
en combinación con la clase Progress<T>
. En cualquier caso, su algoritmo se ejecuta en un hilo diferente, pasando periódicamente actualizaciones al hilo de la interfaz de usuario (por ejemplo, cada rectángulo, cada diez rectángulos, lo que sea). El subproceso de la interfaz de usuario recibe una actualización, agrega los datos a las imágenes y luego vuelve a esperar la próxima actualización.
BackgroundWorker
y Progress<T>
ambos proporcionan mecanismos incorporados para organizar automáticamente los datos de vuelta a la secuencia de UI. La única advertencia es que cualquiera de esas clases que esté utilizando, la instancia de esa clase debe crearse en el hilo de la interfaz de usuario. Como deben configurarse antes de comenzar a ejecutar el trabajo asincrónico, esto normalmente no es un problema; viene gratis
Si lo haces de esta manera, no se necesita ningún hacks como los tres diferentes que se han sugerido aquí hasta ahora (dos de los cuales no parecen probable que sea aplicable en el "He bloqueado mi hilo de interfaz de usuario, ¿ahora qué? "escenario de todos modos).
Esto no fue el 100% de la solución, pero me inició en la dirección correcta. Esto es en última instancia lo que funcionó: 'canvas.Dispatcher.Invoke (emptyDelegate, DispatcherPriority.Render);' donde emptyDelegate es 'Action emptyDelegate = delegate {};' – ohmusama
Gracias, Simon, por la edición que hiciste hoy. Estoy leyendo el artículo ahora. – philologon
El enlace a "Crear aplicaciones más receptivas con el despachador" ya no funciona. –