我有一个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中创建代码的最佳方式吗?
感谢您的时间。
答案 0 :(得分:18)
你混淆了事情。
Dispatcher.CurrentDispatcher
与Application.Current.Dispatcher
不同。
第二个是你似乎在寻找的那个。
看看这个。
Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher
使用应用程序调度程序进行试用。
答案 1 :(得分:1)
Dispatcher.CurrentDispatcher
是"当前"的调度员。线程 - 在这种情况下,线程RaisePathChanged
正在执行。
当你说Dispatcher.CurrentDispatcher
.NET将创建一个新的调度程序,如果没有。
然而,它不会Run()
说调度员!
因此,当您在其上安排某些内容(使用BeginInvoke
)时,除非该调度程序正在运行,否则实际上不会执行该内容。
这可能回答你的第一个问题(为什么不是调用?)
为了避免跨线程访问冲突,您需要线程的调度程序创建您要保护的任何内容并确保它是正在运行的调度程序。
如果您要保护的内容是在默认的GUI线程上创建的,那么使用Application.Current.Dispatcher
就像上一个答案所说的那样,否则您需要做更多的解释并发布更多代码才能回答第二个问题题。 http://www.diranieh.com/NET_WPF/Threading.htm介绍了这个主题。