我是WPF的新手,对调度员和Delegate.Invoke
有疑问。
在Windows窗体应用程序中,我们可以使用invoke方法从其他线程更改UI控件。这是因为调用“在拥有控件的底层窗口句柄的线程上执行指定的委托”(根据msdn)。
我的问题是:
为什么Invoke
不能在WPF上运行?应该允许对UI进行更改,因为拥有UI控件的线程可以执行委托,但它仍然会抛出一个运行时异常“一个线程正在尝试修改由另一个线程拥有的对象“
调度员在Invoke
失败时如何设法更改WPF控件?
是否可以在不使用调度程序或后台工作程序的情况下在WPF中进行跨线程编程?
答案 0 :(得分:1)
1)为什么不调用wpf上的工作?
它工作正常,但也许你没有正确使用它。我建议你阅读the documentation
应该允许对UI进行更改,因为拥有UI控件的线程可以执行委托,但它仍然会抛出一个运行时异常“一个线程正在尝试修改另一个线程拥有的对象“
也许您在工作线程上创建了一个UI对象,然后尝试将其添加到UI线程上的主UI中?没有看到你的代码,这只是猜测......
2)在调用失败时,调度程序如何设法对wpf控件进行更改?
这个问题不是很清楚,但它可能与第一个问题有关......
3)是否可以在不使用调度程序或后台工作程序的情况下在wpf中进行跨线程编程?
如果需要从工作线程操纵UI,则必须使用调度程序。 BackgroundWorker
还使用调度程序(间接地,通过ISynchronizationContext
接口)在UI线程上引发事件。没有办法解决它。