WPF从其他线程访问GUI

时间:2010-03-02 14:46:40

标签: wpf multithreading named-pipes

我正在制定仅制作WPF应用程序单实例的要求。 但是 - 我必须将命令行传递给第一个实例,然后执行一些UI操作。

我使用Mutext检查已经运行的实例,我使用NamedPipes将命令行传输到已经运行的实例。

但当然我没有使用正确的线程来访问“Window1”。 我试图在静态类中存储对“Window1”的引用,然后使用Dispatcher在“Window1”中调用Method,但是,一旦我尝试访问变量(“Window1”中的类范围范围),我就会收到“对象引用未设置为对象的实例。”

UI动作是向TabControl添加一个新的Tab - 在新Tab的初始化期间完成了一些工作 - 并且变量被初始化,甚至我想要调用的方法在init期间工作 - 但是当从Dispatcher失败了。

任何提示,怎么做?我在这里错了吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

这很简单:

void ProcessCommandLine(string commandLine)
{
  Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() =>
  {
    ... code to process the command line here ...
  });
}

您可以从App.Startup以及从命名管道接收消息的线程中调用此方法。

这里的关键考虑因素是:

  1. 使用BeginInvoke而不是Invoke来阻止调用线程等待
  2. 使用DispatcherPriority.ApplicationIdle保证应用程序在处理命令行之前已完成初始化
  3. 在Window1尚未初始化的情况下使用Application.Current.Dispatcher而不是Window1.Dispatcher

答案 1 :(得分:2)

那是不对的,您确定互斥锁是否正确地将控制权传递给您当前运行的应用程序实例?

如果是线程UI访问问题,您应该收到此错误:调用线程无法访问此对象,因为另一个线程拥有它。

您正在获取“未将对象引用设置为对象实例”的事实。错误消息表示您尚未将对象实例化为新对象。