Silverlight的多线程能力(上)

  对于多线程其实一直以来都存在很多误区:比如多任务与多线程就很容易被混为一谈,而多线程也常被理所应当的认为是并行等等。而事实却是:多任务≠多线程、单任务≠单线程、多线程不一定并行,多线程与性能不成线性关系等等,其中道理在这里不再详述。笔者认为Silverlight多线程主要作用不是在于提高性能,而是在于用户体验,其根本目的是解决用户体验中的响应速度,减少单线程带来的阻塞问题。用一个贴切的例子来形容单线程和多线程的区别:单线程就好像只有一个服务窗口卖票的车站,人们排队买票时都是单线程处理的,而且不能抢夺位置,这样只要前方有一个人出现长时间等待,后面的人都不能被响应,这就出现了单线程阻塞;而多线程就好像有多个服务窗口去卖票,这样车票买卖和等待的情况就会好很多(当然这个例子如果换成公共厕所,对于用户体验就显得更为重要了)。

  这次我们就要来看看Silverlight的多线程能力,其实Silverlight的多线程体现在两大方面:

  第一方面是将UI线程与后台工作线程的分离,使得UI线程可以更好地响应用户操作,而后台线程处理完后,允许通过异步的方式将处理结果推回前台进行展示。笔者认为这是多线程在Silverlight中最主要的作用(很多传统Web应用开发者在刚开始接触Silverlight时很不适应这种前后台线程的异步操作)。

  第二方面是对后台作业的多线程支持,比如当需要在客户端后台并行运算时,你可以通过发起多个线程来完成这些运算。在上期《Silverlight CoreCLR结构浅析》中,我已经给大家介绍了Silverlight的基础类库,其中就包括多线程的相关类集。

  UI线程是Silverlight与用户交互的线程,在Silverlight中UI线程是单一的,其中装入的是UI控件类及用于数据绑定的View Model类(什么是View Model?就是只为View层服务的实体,如果要展开说会很长,就此打住!),而在后台线程中是不能直接访问这些UI线程中的数据与控件对象的属性。但大家不用担心,Silverlight和WPF的线程模型都使用了类似于Java Swing中EDT(Event Dispatch Thread)这种安全的事件分发线程模型来解决UI线程与其他后台线程的数据互访问题。在Silverlight(WPF)的控件类库System.Windows下所有类都继承了DependencyObject基类,DependencyObject类不仅提供了Silverlight(WPF)最基础的依赖性属性服务(什么是依赖性属性?简单的说就是对象属性值依赖于其他计算值的方式,这种方式为数据绑定、动画、重用样式都提供了可行性,这里不再展开),同时也开启了UI线程与后台线程的数据互访通道,在DependencyObject中有一个非常重要的属性——Dispatcher,后台线程可以通过调用发起者(一般都是UI控件)的Dispatcher来实现互操作,后台线程可以通过下面的方式来直接操作UI线程中的对象:

_UISender.Dispatcher.BeginInvoke(() => 
{
//这里可以访问UI线程中的对象,因为这个委托本身就在UI线程中执行
}

NET技术Silverlight的多线程能力(上),转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。