2013-11-22 29 views
7

Ich habe eine FileSystemWatcher und die dadurch ausgelösten Ereignisse, wenn Änderungen an einer überwachten Datei in einem anderen Thread als dem UI-Thread ausgelöst werden. Um zu vermeiden, und verkanten Spaß acess volation, ich bin versucht,Dispatcher.CurrentDispatcher.BeginInvoke wird nicht aufgerufen

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

Dies kompiliert fein zu verwenden und die RaisePathChanged wird gebrannt, wie es sein sollte. Der Code innerhalb des Delegaten Action(() => { /*Here*/ }) wird jedoch nie aufgerufen/aufgerufen, der Code wird nur übersprungen.

Warum wird der Code übersprungen, wie kann ich ihn beheben und ist dies der beste Weg, um sicherzustellen, dass Code auf dem Thread ausgeführt wird, der ihn in WPF erstellt hat?

Danke für Ihre Zeit.

Antwort

1

Dispatcher.CurrentDispatcher ist der Dispatcher des "aktuellen" Threads - in diesem Fall wird der Thread RaisePathChanged ausgeführt.
Wenn Sie sagen, Dispatcher.CurrentDispatcher .NET erstellt einen neuen Dispatcher, wenn es keine gab.
Es wird aber nicht Run() sagte Dispatcher!
Also, wenn Sie etwas darauf planen (mit BeginInvoke) wird es nicht wirklich ausgeführt werden, wenn dieser Dispatcher ausgeführt wird.
Das wahrscheinlich beantwortet Ihre erste Frage (Warum ist es nicht aufrufen?)
Um Cross-thread Zugriffsverletzung zu vermeiden, benötigen Sie den Dispatcher des Threads, der erstellt, was Sie versuchen zu schützen und stellen Sie sicher, dass es ein ausführender Dispatcher ist.
Wenn alles, was Sie zu schützen versuchen, auf dem Standard-GUI-Thread erstellt wurde, dann verwenden Sie Application.Current.Dispatcher wie die vorherige Antwort sagt, sonst müssen Sie ein bisschen mehr erklären und ein wenig mehr Code veröffentlichen, bevor wir Ihre zweite Frage beantworten können. http://www.diranieh.com/NET_WPF/Threading.htm hat ein ziemlich kurzes Intro in das Thema.