关于wpf调度员

时间:2011-11-09 10:34:09

标签: wpf

我是WPF的新手,对调度员和Delegate.Invoke有疑问。

在Windows窗体应用程序中,我们可以使用invoke方法从其他线程更改UI控件。这是因为调用“在拥有控件的底层窗口句柄的线程上执行指定的委托”(根据msdn)。

我的问题是:

  1. 为什么Invoke不能在WPF上运行?应该允许对UI进行更改,因为拥有UI控件的线程可以执行委托,但它仍然会抛出一个运行时异常“一个线程正在尝试修改由另一个线程拥有的对象“

  2. 调度员在Invoke失败时如何设法更改WPF控件?

  3. 是否可以在不使用调度程序或后台工作程序的情况下在WPF中进行跨线程编程?

1 个答案:

答案 0 :(得分:1)

  

1)为什么不调用wpf上的工作?

它工作正常,但也许你没有正确使用它。我建议你阅读the documentation

  

应该允许对UI进行更改,因为拥有UI控件的线程可以执行委托,但它仍然会抛出一个运行时异常“一个线程正在尝试修改另一个线程拥有的对象“

也许您在工作线程上创建了一个UI对象,然后尝试将其添加到UI线程上的主UI中?没有看到你的代码,这只是猜测......

  

2)在调用失败时,调度程序如何设法对wpf控件进行更改?

这个问题不是很清楚,但它可能与第一个问题有关......

  

3)是否可以在不使用调度程序或后台工作程序的情况下在wpf中进行跨线程编程?

如果需要从工作线程操纵UI,则必须使用调度程序。 BackgroundWorker还使用调度程序(间接地,通过ISynchronizationContext接口)在UI线程上引发事件。没有办法解决它。