我正在通过仅仅制作一个WPF应用程序单实例的需求。 但是 - 我必须将命令行传递给第一个实例,然后执行一些UI操作。来自其他线程的WPF访问GUI
我正在使用Mutext检查已运行的实例,我使用NamedPipes将命令行转移到已经运行的实例。
但当然,我不是在正确的线程访问“Window1”。 我尝试在静态类中存储对“Window1”的引用,然后使用Dispatcher在“Window1”中调用方法,但是,只要我尝试访问变量(“Window1”中的类范围广)I会收到“未设置为对象实例的对象引用”。
UI操作是为TabControl添加一个新的Tab - 在新Tab的初始化过程中,一些工作已经完成 - 并且变量被初始化,甚至我想调用的方法在init中工作 - 但是当从调度程序失败。
任何提示,如何做到这一点?我在这里错了吗?
谢谢!
伟大的信息射线。我之前发布的解决方案是我遇到的问题,以解决我遇到的问题,并简单地转发该信息。我做了一些更多的研究,发现你发布了同样的东西(BeginInvoke可能会解决OP的问题)。我对使用lambda表达式而不是回调函数的更多信息感兴趣。我使用我在几个地方发布的代码,并且正在考虑改变它,如果有更好的方法。你有什么链接进入更深层次的解释?再次感谢! – Scott 2010-03-02 20:35:01
@Scott:lambda表达式实际上只是语法糖。我在其他评论中提到的性能差异是什么让我们忽略了对Dispatcher.CheckAccess的调用。 Dispatcher.Invoke已经做了Dispatcher.CheckAccess()内部,因此调用Dispatcher.Invoke之前做重复工作和杂波的代码。当你在同一个线程性能相当于但是当你没有,的checkAccess()被调用三次,如果我们手动调用它(从调用代码的调用之前一次,一次,一旦在递归调用)。 – 2010-03-02 22:46:00
再次感谢您的回复!这非常有趣!我发现的所有文章(包括msdn)都建议添加Dispatcher.CheckAccess以防止不必要的调用(请参阅链接)。我不打算怀疑,但我希望你能指点我一些文件。感谢您分享您的知识! 链接: http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.checkaccess(VS.100).aspx http://social.msdn.microsoft.com/论坛/ EN-US/WPF /线程/ 14f7ca5e-fb1c-433E-94d4-269c3ddcedec http://blog.decarufel.net/2009/03/good-practice-to-use-dispatcher-in-wpf.html – Scott 2010-03-02 23:41:02