2013-11-22 9 views
7

Ho un FileSystemWatcher e gli eventi generati da questo quando un file osservato modifiche vengono sollevate su un thread diverso dal thread dell'interfaccia utente. Per evitare e cross-thread acess volation divertente, sto cercando di utilizzareDispatcher.CurrentDispatcher.BeginInvoke Non invocazione

public void RaisePathChanged(object sender, RenamedEventArgs e) 
{ 
    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => 
    { 
     // Some code to handle the file state change here. 
    })); 
} 

Questo compila bene e il RaisePathChanged è licenziato come dovrebbe essere. Tuttavia, il codice all'interno del delegato Action(() => { /*Here*/ }) non viene mai chiamato/invocato, il codice viene semplicemente saltato.

Perché il codice viene saltato, come posso correggerlo ed è questo il modo migliore per assicurare che il codice venga eseguito sul thread che lo ha creato in WPF?

Grazie per il vostro tempo.

risposta

1

Dispatcher.CurrentDispatcher è il dispatcher del thread "corrente" - in questo caso la thread RaisePathChanged è in esecuzione.
Quando dici Dispatcher.CurrentDispatcher .NET creerà un nuovo dispatcher se non ce n'era nessuno.
Tuttavia, non sarà inviato a Run() dispatcher!
Quindi, quando si pianifica qualcosa su di esso (con BeginInvoke), non verrà effettivamente eseguito a meno che il dispatcher sia in esecuzione.
Probabilmente risponde alla prima domanda (Perché non sta invocando?)
Per evitare la violazione dell'accesso cross-thread, è necessario il dispatcher del thread che ha creato tutto ciò che si sta tentando di proteggere e assicurarsi che sia un dispatcher in esecuzione.
Se qualsiasi cosa si sta tentando di proteggere è stata creata sul thread GUI predefinito, quindi utilizzare Application.Current.Dispatcher come la risposta precedente dice, altrimenti sarà necessario fare un po 'più di spiegazione e postare un po' di codice prima di poter rispondere alla seconda domanda. http://www.diranieh.com/NET_WPF/Threading.htm ha una introduzione piuttosto breve nell'argomento.