Dispatcher.CurrentDispatcher.BeginInvoke Nicht Aufrufen
Ich habe eine FileSystemWatcher
und die Ereignisse, die durch diese wenn eine überwachte Datei änderungen erhöht, die auf einem anderen thread aus dem UI-thread. Zu vermeiden und cross-thread-acess volation Spaß, ich bin versucht,
public void RaisePathChanged(object sender, RenamedEventArgs e)
{
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
{
//Some code to handle the file state change here.
}));
}
Diese kompiliert fein und die RaisePathChanged
ausgelöst wird, wie es sein sollte. Jedoch wird der code innerhalb des Delegaten Action(() => { /*Here*/})
wird nie aufgerufen/angerufen wird, der code wird lediglich übersprungen.
Warum ist der code übersprungen, wie kann ich es beheben und ist das der beste Weg zu versichern code auf den thread, dass es in WPF?
Vielen Dank für Ihre Zeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du vermischt Dinge.
Dispatcher.CurrentDispatcher
ist nicht das gleiche wieApplication.Current.Dispatcher
.Die zweite ist die, die Sie zu sein scheinen suchen.
Werfen Sie einen Blick auf diese.
Dispatcher.CurrentDispatcher vs. Anwendung.Aktuelle.Dispatcher
Versuchen Sie es mit der Anwendung dispatcher.
Dispatcher.CurrentDispatcher
ist der dispatcher der "aktuellen" thread - in diesem Fall der threadRaisePathChanged
ausgeführt wird.Wenn Sie sagen
Dispatcher.CurrentDispatcher
.NET erstellen Sie eine neue dispatcher, wenn keiner da war.Es wird jedoch nicht
Run()
sagte dispatcher!Also, wenn Sie planen, etwas auf Sie (mit
BeginInvoke
) es wird nicht wirklich durchgeführt werden, es sei denn, der Verteiler ausgeführt wird.Dass wahrscheinlich Antworten der ersten Frage (Warum ist es nicht Aufrufen?)
Zur Vermeidung von cross-thread access violation, müssen Sie den dispatcher der den thread erstellt hat, was Sie zu schützen versuchen, und stellen Sie sicher, es ist ein running dispatcher.
Wenn, was Sie versuchen, zu schützen, wurde auf dem Standard-GUI-thread, dann verwenden Sie
Application.Current.Dispatcher
wie bei der vorherigen Antwort sagt, sonst müssen Sie ein bisschen mehr erklären, und nach ein bisschen mehr code, vor, können wir die Antwort auf Ihre zweite Frage. http://www.diranieh.com/NET_WPF/Threading.htm hat einen ziemlich kurzen intro in das Thema ein.