在Silverlight中,this.Dispatcher.BeginInvoke()和Deployment.Current.Dispatcher.BeginInvoke()方法之间的区别是什么?

7

我知道Dispatcher.BeginInvoke()用于在UI线程中执行代码。最近,我注意到还有另一种使用'Deployment'类获取Dispatcher实例的方法。我想知道this.Dispatcher.BeginInvoke()Deployment.Current.Dispatcher.BeginInvoke()函数之间是否有区别?什么时候应该使用this.Dispatcher.BeginInvoke()Deployment.Current.Dispatcher.BeginInvoke()

谢谢 Alex

1个回答

11
简短回答:在Silverlight中它们是相同的,因此使用更短的那一个(如果在代码上下文中可用)。 this.Dispatcher.BeginInvoke() 确保它在相关控件运行的线程上运行。 Deployment.Current.Dispatcher.BeginInvoke() 确保它在主UI线程上运行。
在Silverlight中这两个始终是相同的(通常在WPF中也是如此,除非您已创建额外的UI线程)。
除非当前上下文中没有分派程序,请使用this.Dispatcher.BeginInvoke(),否则请使用全局分派程序。

它们在什么情况下不相同? - AnthonyWJones
@AnthonyWJones:Dispatcher.Current检索与执行代码的线程相关联的调度对象。因此,当在不同的线程上调用它们时,它们是不同的。 - user1228
@Will:你是指Deployment.Current还是Dispatcher.Current? - wizzardz
@wizzardz:调度程序。我不清楚Deployment.Current的行为。 - user1228
1
@Will:在Silverlight中,Deployment.Current.Dispatcher始终与UI线程相关联。Silverlight中没有Dispatcher.CurrentDependencyObjectDispatcher属性也总是返回与UI线程相关联的Dispatcher。因此,我正在尝试想象存在差异的情况。 - AnthonyWJones
@AnthonyWJones:刚才意识到这是关于Silverlight的问题。是的,在Silverlight中你不能创建额外的UI线程,所以它们总是相同的。我会修改回答。 - iCollect.it Ltd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接