技术开发 频道

Silverlight 4中五种多线程编程技巧

  还有另外一个情况是,在.dll程序集情况下,我们也可以通过使用Deployment.Current.Dispatcher来获得应用程序的调度器Dispatcher的一个引用。例如,要改变一个UI线程中的Silverlight控件的Text属性值,你可以使用下面的代码:

  清单7:

       private void Button_Click(object sender, RoutedEventArgs e)

  {

  
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:

private void Button_Click(object sender, RoutedEventArgs e)

  {

  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对象进行更深入的探讨。

0
相关文章