Dispatcher.CurrentDispatcher.BeginInvoke不调用

我有一个FileSystemWatcher ,当在UI线程的不同线程上引发监视文件更改时,由此引发的事件。 为了避免和交叉线程的声音乐趣,我试图使用

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

这个编译得很好,并且应该触发RaisePathChanged 。 但是,委托Action(() => { /*Here*/ })的代码永远不会被调用/调用,代码只是被跳过。

为什么要跳过代码,我该如何修复它?这是确保代码在WPF中创建它的线程上运行的最佳方法吗?

谢谢你的时间。

你在混淆东西。

Dispatcher.CurrentDispatcherApplication.Current.Dispatcher

第二个是你似乎在寻找的那个。

看看这个。

Dispatcher.CurrentDispatcher与Application.Current.Dispatcher

使用应用程序调度程序进行试用。

Dispatcher.CurrentDispatcher是“当前”线程的调度程序 – 在这种情况下,线程RaisePathChanged正在执行。
当你说Dispatcher.CurrentDispatcher .NET将创建一个新的调度程序,如果没有。
然而,它不会Run()表示调度员!
因此,当您在其上安排某些事情(使用BeginInvoke )时,除非该调度程序正在运行,否则它实际上不会被执行。
这可能回答你的第一个问题(为什么不调用?)
为了避免跨线程访问冲突,您需要线程的调度程序创建您要保护的任何内容,并确保它是一个正在运行的调度程序。
如果你想要保护的是在默认的GUI线程上创建的,那么使用Application.Current.Dispatcher就像前面的答案所说的那样,否则你需要做更多的解释并发布一些代码才能回答你的第二个问题。题。 http://www.diranieh.com/NET_WPF/Threading.htm有一个很短的介绍主题。