2009-08-16 16 views
14

Ho provato a utilizzare gli esempi da MSDN per questo ma sembrano essere applicabili solo a Windows Form. Ad esempio il metodo di utilizzo di .InvokeRequired si basa sul controllo dei moduli di Windows, tuttavia questo metodo non è disponibile per i controlli WPF. Il metodo operaio Backgound genera InvalidOperationException così -Come accedere al controllo WPF C# in modo thread-safe?

Il thread chiamante non può accedere a questo oggetto perché un thread diverso possiede esso.

Quindi, come può essere fatto nel contesto di WPF?

risposta

33

Si desidera semplicemente utilizzare il metodo Dispatcher.Invoke (o l'equivalente asincrono Dispatcher.BeginInvoke), che effettuerà il marshalling della chiamata al thread dell'interfaccia utente WPF principale.

La classe DependencyObject contiene una proprietà Dispatcher, il che significa che tutti i controlli e altri oggetti che ereditano da questa classe anche fornire questa struttura, in modo simile a WinForms. Inoltre, l'oggetto Application fornisce l'accesso al dispatcher.

Un esempio d'uso potrebbe essere il seguente (in code-dietro di una Window/UserControl):

this.Dispatcher.Invoke((Action)(() => 
    { 
     ... 
    })); 
+0

Grazie, che funzionava perfettamente. In realtà è molto più semplice in WPF che vincere moduli, quando sai cosa devi fare ;-) –

+0

Nessun problema. E sì, WPF ha sicuramente un modello migliore di threading/message pump. – Noldorin

Problemi correlati