2009-05-14 18 views
10

sto ottenendo questo errore:Che cos'è un genitore freezable? Cosa significa questo errore?

non può utilizzare un DependencyObject che appartiene a un thread diverso rispetto al suo genitore Freezable

Che cosa vuol anche dire? È in inglese? Il genitore è congelato o è solo congelabile? Un modo per rendere un genitore non freezable, se fa andare via l'errore?

Cosa sta succedendo:

ho due OpenGL controlli WinForms in un'applicazione WPF, e finora, tutto ha lavorato senza intoppi (credo). Ora, ho aggiunto un aggiornamento in modo che quando un controllo della forma di vinificazione aggiorna l'immagine, anche l'altra dovrebbe. In realtà funzionava, e ora sto ricevendo quell'errore. Passare attraverso il codice ha l'incidente che si verifica in luoghi casuali, il che mi porta a credere che si tratti di un errore di garbage collection (cioè, qualche aggiornamento in un altro thread sta creando qualcosa che sta raccogliendo i dati inutili, e quella raccolta avviene in un momento casuale).

L'eccezione viene rilevata nel metodo di esecuzione principale ed è un'eccezione InvalidOperationException.

Sto afferrando le cannucce qui. Da dove comincio?

EDIT: Sembra che la chiamata che sta causando il problema è questo:

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

Sto ancora monitoraggio verso il basso; se quella serie di righe è commentata, il crash continua ancora e lo stato del thread ha un thread 'appena concluso' (da qui l'assunzione della garbage collection).

+1

Uno dei pochi casi in cui diagrammi una frase sarebbe utile .. –

+1

Formulazione del titolo estremamente negativa. Nessuno può trovare questa domanda cercando le parole chiave pertinenti, perché nessuna è nel titolo. Questo non è un forum di supporto, formula correttamente le tue domande ... – Timwi

+1

Ehi, @Timwi, leggi la risposta. Renditi conto che ho lasciato questa domanda solo perché ho trovato la risposta, ma è stato estremamente frustrante. Se vuoi modificare il titolo, ottieni più rappresentanti e fallo da solo per come pensi che dovrebbe essere. – mmr

risposta

12

OK, l'ho capito. Normalmente, cancellerei semplicemente questa domanda, ma è stato difficile trovare informazioni su come risolvere questo problema.

Il problema era una chiamata che si presentava così:

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; 
    })); 
} 

Ma! se lo fai, allora il dispatcher funziona, e poi prova a eliminare il pennello, ma il pennello stesso viene apparentemente cancellato in un'altra posizione.

Quindi, la lezione da portare a casa è, se si dichiara un ImageBrush, quindi eliminarlo nello stesso thread, in questo modo:

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(); 
    })); 
} 
Problemi correlati