2009-05-14 14 views
10

que estoy recibiendo este error:¿Qué es un freezable para padres? ¿Qué significa este error?

no puede utilizar un DependencyObject que pertenece a un hilo diferente al de su matriz puede congelar

¿Qué significa eso? ¿Está en inglés? ¿El padre está congelado o solo es congelable? ¿Alguna manera de hacer que un padre no sea congelable, si hace que desaparezca el error?

Qué pasa:

que tienen dos controles WinForms OpenGL en una aplicación WPF, y hasta ahora, todo ha estado trabajando sin problemas (creo). Ahora, he agregado una actualización para que cuando un control de winform actualice la imagen, el otro también lo haga. Eso solía funcionar, y ahora estoy recibiendo ese error. Pasar por el código hace que el bloqueo ocurra en lugares aleatorios, lo que me lleva a pensar que es un error de recolección (es decir, que una actualización en otro hilo está creando algo que está siendo recolectado, y esa recolección ocurre en un momento aleatorio).

La excepción se detecta en el método de ejecución principal, y es una InvalidOperationException.

Estoy agarrando paja aquí. ¿Dónde empiezo?

EDIT: Parece que la llamada que está causando el problema es éste:

 if (imagePanel.InvokeRequired) 
     { 
      imagePanel.Invoke(new System.Windows.Forms.MethodInvoker(delegate{ 
       imagePanel.ClearImages(); 
      })); 
     } 
     else 
     { 
      imagePanel.ClearImages(); 
     } 

Todavía estoy seguimiento hacia abajo; si esa serie de líneas está comentada, el bloqueo aún ocurre, y el estado del hilo tiene una cadena 'acabada' (de ahí la suposición de recolección de basura).

+1

Uno de los pocos casos en los diagramas una sentencia sería de gran ayuda .. –

+1

Muy mal texto del título. Nadie puede encontrar esta pregunta buscando palabras clave relevantes, porque ninguna está en el título. Este no es un foro de soporte, formule sus preguntas correctamente ... – Timwi

+1

Hola @Timwi, lee la respuesta. Darse cuenta de que solo dejé esta pregunta aquí porque encontré la respuesta, pero fue extremadamente frustrante. Si desea editar el título, obtenga más representantes y hágalo usted mismo según cómo cree que debería ser. – mmr

Respuesta

12

OK, lo he descubierto. Por lo general, simplemente eliminé esta pregunta, pero fue un dolor encontrar información sobre cómo solucionar esto.

El problema era una llamada que se veía así:

ImageBrush theBrush = new ImageBrush(new Bitmap(new Uri(...))); 

if (labelStatus.Dispatcher.Thread == System.Threading.Thread.CurrentThread) { 
    button.background = theBrush; 
} 
else { 
    labelStatus.Dispatcher.BeginInvoke((System.Threading.ThreadStart)(delegate { 
    button.background = theBrush; 
    })); 
} 

Pero! si haces eso, entonces el despachador funciona, y luego intenta eliminar el pincel, pero el pincel también se borrará aparentemente en otra ubicación.

Por lo tanto, la lección para llevar a casa es que, si se declara un ImageBrush, a continuación, elimine en el mismo hilo, así:

void MyFunc(){ 
    ImageBrush theBrush = new ImageBrush(new Bitmap(new Uri(...))); 
    button.background = theBrush; 
} 

if (labelStatus.Dispatcher.Thread == System.Threading.Thread.CurrentThread) { 
    MyFunc(); 
} 
else { 
    labelStatus.Dispatcher.BeginInvoke((System.Threading.ThreadStart)(delegate { 
     MyFunc(); 
    })); 
} 
Cuestiones relacionadas