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.CurrentDispatcher
与Application.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有一个很短的介绍主题。