WPF Dispatcher {“Il thread chiamante non può accedere a questo object perché lo possiede un thread diverso.”}

prima devo dire che sono noob con WPF e C #. Applicazione: creazione di Mandelbrot Image (GUI) Il mio dispatcher funziona perfettamente in questo caso:

private void progressBarRefresh(){ while ((con.Progress) < 99) { progressBar1.Dispatcher.Invoke(DispatcherPriority.Send, new Action(delegate { progressBar1.Value = con.Progress; } )); } } 

Ottengo il messaggio (Titolo) quando provo a farlo con il seguente codice:

 bmp = BitmapSource.Create(width, height, 96, 96, pf, null, rawImage, stride); this.Dispatcher.Invoke(DispatcherPriority.Send, new Action(delegate { img.Source = bmp; ViewBox.Child = img; //vllt am schluss } )); 

Cercherò di spiegare come funziona il mio programma. Ho creato una nuova discussione (perché la GUI non risponde) per il calcolo dei pixel e dei colors. In questa discussione (metodo) Sto usando il Dispatcher per aggiornare la mia immagine nel ViewBox dopo che i calcoli sono pronti.

Quando non inserisco il calcolo in un thread separato, posso aggiornare o creare la mia immagine.

Nel caso in cui si desideri condividere l’object tra diversi thread, creare sempre quell’object sul thread dell’interfaccia utente. Successivamente, quando si desidera accedere all’object, è ansible verificare se si ha accesso all’object. Se non si ha accesso, richiamare nuovamente la funzione con accesso al thread UI. esempio di codice qui sotto:

  private void YourMethod() { if (Application.Current.Dispatcher.CheckAccess()) { // do whatever you want to do with shared object. } else { //Other wise re-invoke the method with UI thread access Application.Current.Dispatcher.Invoke(new System.Action(() => YourMethod())); } } 

MSDN dice: “Un Freezable congelato può essere condiviso tra thread”.

Forse questo thread aiuterà: http://social.msdn.microsoft.com/Forums/en-US/windowswic/thread/9223743a-e9ae-4301-b8a4-96dc2335b686

Quando ottieni un Dispatcher ne ottieni uno diverso per ogni thread differente.

this.Dispatcher potrebbe darti un altro Dispatcher non quello dell’interfaccia utente, quindi ottieni questo errore.

Prova invece ad usare Application.Current.Dispatcher , questo restituirà sempre il Dispatcher del thread dell’interfaccia utente.

Lo stesso errore potrebbe verificarsi se si utilizza Dispatcher.CurrentDispatcher da un’altra discussione, ovviamente.

Stai creando il bitmap ( bmp ) sul tuo worker (?) Thread e poi passandolo al thread dell’interfaccia utente – è questo che non funziona.

Devi creare l’immagine sul thread dell’interfaccia utente. Probabilmente avrai bisogno di un modo per fare riferimento a quale immagine desideri visualizzare e passare tali informazioni all’interfaccia utente.

È anche ansible utilizzare un meccanismo di accodamento per passare i messaggi tra i thread. Dopotutto, è così che funziona l’architettura di Windows. Questo è ciò che fa il dispatcher. Stai passando un riferimento al delegato, che non è di proprietà del thread WPF.

Quindi sì, hai l’idea di base, ma devi effettivamente passare la bitmap all’altro thread usando Action(T object) , o nel tuo caso:

 Dispatcher.Invoke(DispatcherPriority.Send, new Action(delegate(Bitmap img) { do things here... }), bmp);