还有另外一个情况是,在.dll程序集情况下,我们也可以通过使用Deployment.Current.Dispatcher来获得应用程序的调度器Dispatcher的一个引用。例如,要改变一个UI线程中的Silverlight控件的Text属性值,你可以使用下面的代码:
清单7:
{
new Thread(() =>
{
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
this.TextBlock1.Text = DateTime.Now.ToString();
});
}).Start();
}
顺便说一句,网址http://blogs.infragistics.com/blogs/mihail_mateev/archive/2010/04/18/build-facebook-applications-with-silverlight-3-and-silverlight-4-part-4.aspx处提供了一个很好的例子,供大家参考之用。
4.使用SynchronizationContext
相比于以前的对象,SynchronizationContext似乎有点神秘。根据MSDN的介绍,SynchronizationContext对象能够提供各种同步模型环境下的传播同步的上下文的基本功能。据我从网上搜索的结果,结论应该是:对SynchronizationContext的发明旨在简化同步—只要你确保你是在UI线程内;否则,它会返回一个空值。因此,在大多数情况下,你可以使用Deployment.Current.Dispatcher来作为System.Windows.Deployment.Current.Dispatcher的替代。至于使用SynchronizationContext,并不是一件困难的事情。例如,你也可以如下所示来同步实现与上述类似的操作。
清单8:
{
var context = SynchronizationContext.Current;
new Thread(() =>
{
context.Send((s) =>
{
this.TextBlock1.Text = DateTime.Now.ToString();
}, null);
}).Start();
}
注意,丹尼尔.沃恩(http://www.codeproject.com/Articles/51457/Synchronous-Invocation-of-Delegates-with-the-Silve.aspx)为SynchronizationContext提供了一个良好的封装类;有基础的读者可以对这个SynchronizationContext对象进行更深入的探讨。