Pregunta

... o ...

" ¿Qué maldad en las profundidades de WPF me he despertado? "

Estoy creando un lienzo en un hilo de fondo y lo estoy renderizando en un mapa de bits. Llevo más de un año trabajando en el código de producción sin problemas. Yo hago lo siguiente:

  • crea un objeto Canvas
  • crear un nuevo objeto NameScope
  • asigne ese NameScope al lienzo
  • dibuja lo que quiera en el lienzo
  • llame al lienzo. Mida () con el tamaño del lienzo
  • llame a canvas.Arrage () con el rect disponible de Canvas
  • call canvas.UpdateLayout ()
  • render the Canvas

En el paso de sorteo, siempre acabo de llamar a canvas.Children.Add () para poner UIElements en el Canvas. Esto siempre ha funcionado.

Ahora, por alguna razón inexplicable, en un caso específico de la aplicación en la que estoy trabajando, la llamada a canvas.Children.Add () se cuelga indefinidamente, bloqueando mi hilo de fondo. No puedo pensar en nada que esté haciendo de manera diferente entre el código que ha estado trabajando durante más de un año y este caso específico.

¿Alguien puede sugerir posibles razones por las que una llamada a canvas.Children.Add () se cuelgue de esta manera?

Editar : el subproceso en segundo plano es un subproceso STA (el modelo de procesamiento de subprocesos en segundo plano se implementó porque no pude procesar imágenes usando WPF en un subproceso MTA), por lo que el modelo de apartamento del subproceso no debería No seas el culpable.

Editar # 2 : si bien entiendo por qué la gente sugiere que pruebe Dispatcher.BeginInvoke () desde mi hilo de fondo, no me gusta esa opción por dos razones:

  1. Quiero que el procesamiento de mi subproceso de fondo sea síncrono en ese hilo. Mi hilo de fondo tiene una cola a la que otros subprocesos envían trabajos de imagen, y mi hilo de fondo procesa cada trabajo a medida que los recibe. El uso de Dispatcher.BeginInvoke () agrega otra capa de complejidad que preferiría evitar.
  2. Nunca he necesitado hasta ahora. Hacer este procesamiento en segundo plano de forma síncrona en mi subproceso en segundo plano simplemente ha funcionado trabajado . Estoy tratando de determinar qué podría ser diferente en este extraño caso de borde que hace que este código no funcione. Si no puedo hacerlo funcionar, terminaré reescribiendo este código de procesamiento sin WPF, que también preferiría evitar.
¿Fue útil?

Solución

¿Qué modelo de apartamento está utilizando para su subproceso de fondo?

Creo que WPF necesita ejecutarse en el subproceso STA. Cuando genera el subproceso de fondo, intente configurar su apartamento en STA.

Actualización :

Si el subproceso STA no es el problema, intentaría dividir el lienzo en trozos. Básicamente si haces un:

Dispatcher.BeginInvoke (...)

desde su hilo, el delegado proporcionado se inserta en la parte posterior de la cola del despachador, lo que permite que se ejecuten otras tareas en cola.

Actualización 2:

También puede intentar depurar en el código fuente del objeto Canvas utilizando las fuentes de referencia de .NET framework. Puede habilitar esto activando " habilitar .net fuente paso a paso " en las opciones de depuración en Herramientas- > Opciones.

Otros consejos

Intenta llamar a Dispatcher.Run () en el subproceso de fondo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top